Git windows bash 和 windows 命令行的情况不同

Git situation differs in windows bash and windows command line

我的系统中有一个 git 存储库。
当我使用 windows PowerShell 输入 git status 时,我得到一个结果,当我在 windows bash,我得到了不同的结果。

查看图片了解更多详情。

如您在 windows 中看到的 git status PowerShell 显示 Nothing to commit,而 windows bash 中的相同 git status 表示您已取消暂存变化。

这里是git version在两者中的一个输出结果:
Windows powershell: git version 2.18.0.windows.1
Windowsbash: git version 2.7.4

这里是 git diff .idea/gradle.xml:
Powershell:
</code> <strong>Bash</strong>:</p> <pre><code>diff --git a/.idea/gradle.xml b/.idea/gradle.xml index 7ac24c7..15dda04 100644 --- a/.idea/gradle.xml +++ b/.idea/gradle.xml @@ -1,18 +1,18 @@ -<?xml version="1.0" encoding="UTF-8"?> -<project version="4"> - <component name="GradleSettings"> - <option name="linkedExternalProjectsSettings"> - <GradleProjectSettings> - <option name="distributionType" value="DEFAULT_WRAPPED" /> - <option name="externalProjectPath" value="$PROJECT_DIR$" /> - <option name="modules"> - <set> - <option value="$PROJECT_DIR$" /> - <option value="$PROJECT_DIR$/app" /> - </set> - </option> - <option name="resolveModulePerSourceSet" value="false" /> - </GradleProjectSettings> - </option> - </component> +<?xml version="1.0" encoding="UTF-8"?>^M +<project version="4">^M + <component name="GradleSettings">^M + <option name="linkedExternalProjectsSettings">^M + <GradleProjectSettings>^M + <option name="distributionType" value="DEFAULT_WRAPPED" />^M + <option name="externalProjectPath" value="$PROJECT_DIR$" />^M + <option name="modules">^M + <set>^M + <option value="$PROJECT_DIR$" />^M + <option value="$PROJECT_DIR$/app" />^M + </set>^M + </option>^M + <option name="resolveModulePerSourceSet" value="false" />^M + </GradleProjectSettings>^M + </option>^M + </component>^M </project> \ No newline at end of file : diff --git a/.idea/gradle.xml b/.idea/gradle.xml index 7ac24c7..15dda04 100644 --- a/.idea/gradle.xml +++ b/.idea/gradle.xml @@ -1,18 +1,18 @@ -<?xml version="1.0" encoding="UTF-8"?> -<project version="4"> - <component name="GradleSettings"> - <option name="linkedExternalProjectsSettings"> - <GradleProjectSettings> - <option name="distributionType" value="DEFAULT_WRAPPED" /> - <option name="externalProjectPath" value="$PROJECT_DIR$" /> - <option name="modules"> - <set> - <option value="$PROJECT_DIR$" /> - <option value="$PROJECT_DIR$/app" /> - </set> - </option> - <option name="resolveModulePerSourceSet" value="false" /> - </GradleProjectSettings> - </option> - </component> +<?xml version="1.0" encoding="UTF-8"?>^M +<project version="4">^M + <component name="GradleSettings">^M + <option name="linkedExternalProjectsSettings">^M + <GradleProjectSettings>^M + <option name="distributionType" value="DEFAULT_WRAPPED" />^M + <option name="externalProjectPath" value="$PROJECT_DIR$" />^M + <option name="modules">^M + <set>^M + <option value="$PROJECT_DIR$" />^M + <option value="$PROJECT_DIR$/app" />^M + </set>^M + </option>^M + <option name="resolveModulePerSourceSet" value="false" />^M + </GradleProjectSettings>^M + </option>^M + </component>^M </project> \ No newline at end of file :...skipping... diff --git a/.idea/gradle.xml b/.idea/gradle.xml index 7ac24c7..15dda04 100644 --- a/.idea/gradle.xml +++ b/.idea/gradle.xml @@ -1,18 +1,18 @@ -<?xml version="1.0" encoding="UTF-8"?> -<project version="4"> - <component name="GradleSettings"> - <option name="linkedExternalProjectsSettings"> - <GradleProjectSettings> - <option name="distributionType" value="DEFAULT_WRAPPED" /> - <option name="externalProjectPath" value="$PROJECT_DIR$" /> - <option name="modules"> - <set> - <option value="$PROJECT_DIR$" /> - <option value="$PROJECT_DIR$/app" /> - </set> - </option> - <option name="resolveModulePerSourceSet" value="false" /> - </GradleProjectSettings> - </option> - </component> +<?xml version="1.0" encoding="UTF-8"?>^M +<project version="4">^M + <component name="GradleSettings">^M + <option name="linkedExternalProjectsSettings">^M + <GradleProjectSettings>^M + <option name="distributionType" value="DEFAULT_WRAPPED" />^M + <option name="externalProjectPath" value="$PROJECT_DIR$" />^M + <option name="modules">^M + <set>^M + <option value="$PROJECT_DIR$" />^M + <option value="$PROJECT_DIR$/app" />^M + </set>^M + </option>^M + <option name="resolveModulePerSourceSet" value="false" />^M + </GradleProjectSettings>^M + </option>^M + </component>^M </project> \ No newline at end of file ~

如您所见,完全不同。

这是 git config -l 的输出: Powershell:

core.symlinks=true
core.autocrlf=true
core.fscache=true
color.diff=auto
color.status=auto
color.branch=auto
color.interactive=true
help.format=html
rebase.autosquash=true
http.sslcainfo=D:/Apps/Git/mingw64/ssl/certs/ca-bundle.crt
http.sslbackend=openssl
diff.astextplain.textconv=astextplain
filter.lfs.clean=git-lfs clean -- %f
filter.lfs.smudge=git-lfs smudge -- %f
filter.lfs.process=git-lfs filter-process
filter.lfs.required=true
credential.helper=manager
user.name=Mahdi
user.email=mahdi.malvandi@pushe.co
core.repositoryformatversion=0
core.filemode=false
core.bare=false
core.logallrefupdates=true
core.ignorecase=true
remote.origin.url=git@github.com:mahdi-malv/shahpari_market.git
remote.origin.fetch=+refs/heads/*:refs/remotes/origin/*
branch.master.remote=origin
branch.master.merge=refs/heads/master
branch.setMainActivity.remote=origin
branch.setMainActivity.merge=refs/heads/setMainActivity
branch.networkSetup.remote=origin
branch.networkSetup.merge=refs/heads/networkSetup
branch.compNav.remote=origin
branch.compNav.merge=refs/heads/compNav
branch.presenter.remote=origin
branch.presenter.merge=refs/heads/presenter
branch.mainUi.remote=origin
branch.mainUi.merge=refs/heads/mainUi
branch.downloadManager.remote=origin
branch.downloadManager.merge=refs/heads/downloadManager
branch.category.remote=origin
branch.category.merge=refs/heads/category
:

Bash:

core.repositoryformatversion=0
core.filemode=false
core.bare=false
core.logallrefupdates=true
core.ignorecase=true
remote.origin.url=git@github.com:mahdi-malv/shahpari_market.git
remote.origin.fetch=+refs/heads/*:refs/remotes/origin/*
branch.master.remote=origin
branch.master.merge=refs/heads/master
branch.setMainActivity.remote=origin
branch.setMainActivity.merge=refs/heads/setMainActivity
branch.networkSetup.remote=origin
branch.networkSetup.merge=refs/heads/networkSetup
branch.compNav.remote=origin
branch.compNav.merge=refs/heads/compNav
branch.presenter.remote=origin
branch.presenter.merge=refs/heads/presenter
branch.mainUi.remote=origin
branch.mainUi.merge=refs/heads/mainUi
branch.downloadManager.remote=origin
branch.downloadManager.merge=refs/heads/downloadManager
branch.category.remote=origin
branch.category.merge=refs/heads/category
branch.setCategory.remote=origin
branch.setCategory.merge=refs/heads/setCategory
branch.searchFix.remote=origin
branch.searchFix.merge=refs/heads/searchFix
branch.homeMoreAPI.remote=origin
branch.homeMoreAPI.merge=refs/heads/homeMoreAPI
branch.userApp.remote=origin
branch.userApp.merge=refs/heads/userApp
branch.allApps.remote=origin
branch.allApps.merge=refs/heads/allApps
branch.settings.remote=origin
branch.settings.merge=refs/heads/settings
branch.autoUpdate.remote=origin
branch.autoUpdate.merge=refs/heads/autoUpdate
branch.tempStore.remote=origin
branch.tempStore.merge=refs/heads/tempStore
branch.fixIcon.remote=origin
branch.fixIcon.merge=refs/heads/fixIcon
branch.changeAd.remote=origin
branch.changeAd.merge=refs/heads/changeAd
branch.updateAndAnal.remote=origin
branch.updateAndAnal.merge=refs/heads/updateAndAnal
branch.merge1.remote=origin
branch.merge1.merge=refs/heads/merge1
branch.fixV1beta.remote=origin
branch.fixV1beta.merge=refs/heads/fixV1beta
branch.sendDevice.remote=origin
branch.sendDevice.merge=refs/heads/sendDevice
branch.newIcon.remote=origin
branch.newIcon.merge=refs/heads/newIcon

是什么导致了这个问题,我该如何解决?

提前致谢。

注:
除了公认的答案外,通过考虑 Ralf 的 ,我发现让两个 shell 使用一个 git 是个好主意。
- 使用 sudo apt remove git.
从 bash 中删除 Git - 在 bash 的 $PATH 中添加 path of git.exe
- 为简单起见,使用 alias git='git.exe' 可以像以前一样使用 Git。

您可以对可能遇到此问题的其他事物执行此操作,例如 python 等等。

除了有两个不同版本的 Git 之外,您还应该检查两个会话中的配置:

git config -l --show-origin

这可能不仅会显示不同的配置,还会显示不同的配置 文件 (例如 HOME 两者之间不同,或者系统配置不同 Git 安装)

在您的设置中,第二个设置中 core.autocrlf=true 的存在解释了 git diff 输出。
确保在 shell.

中输入:git config --global core.autocrlf false

在任何情况下,尝试使用 (with a PortableGit-2.20.1-64-bit.7z.exe Git 未压缩的任何地方),然后在该 CMD 中使用所述简化的 PATH 调用 git bash:结果应该是一样。

set PATH=C:\WINDOWS\system32;C:\WINDOWS;C:\WINDOWS\System32\Wbem;C:\WINDOWS\System32\WindowsPowerShell\v1.0\
set GH=C:\path\to\git
set PATH=%GH%\bin;%GH%\usr\bin;%GH%\mingw64\bin;%PATH%

长话短说:core.autocrlf 在两种环境中都不同。这解释了为什么在 powershell 上它告诉你文件 完全 不同(删除所有内容并再次添加完全相同的内容......因为它正在改变这些行的 EOL)。避免它发生的方法是在 .git 属性上使用它:* -text。如果这样做问题仍然存在,那是 可能 因为文件 已经 更改了其在工作树上的 EOL 格式。尝试将其切换回 HEAD 上的状态,然后文件应该从 git 状态消失。

虽然接受的答案显示了如何解决该问题,但我会给出另一个建议:

在 Powershell git Bash 上使用 git ]。管理同一个工作副本时不要混用。

更新:

可以(很可能)在 Powershell 和其他基于 Windows 的 git 工具上使用 git(您提到 gitKraken 和 Android Studio 在评论中)。

我的理解是 bash 和 Bash 上的 git 来自 Linux 的 Windows 子系统].所以他们会采用不同的 EOL 样式。