Git отличается в Windows Bash и Windows командной строки - PullRequest
0 голосов
/ 07 февраля 2019

В моей системе есть git-репо.
Когда я ввожу git status с помощью Windows PowerShell , я получаю результат, и когда я вхожу в Windows Bash , Я получаю другой результат.

См. Изображение для более подробной информации.

enter image description here

Как вы можете видеть git status в окнахPowerShell сообщает Nothing to commit, в то время как тот же git status в Windows bash говорит о том, что у вас есть неустановленные изменения.

Вот результат вывода git version в обоих случаях:
Windows powershell :git version 2.18.0.windows.1
Windows bash : git version 2.7.4

А вот git diff .idea/gradle.xml:
Powershell :
Bash :

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

Что вызывает эту проблему и как я могу ее исправить?

Заранее спасибо.

Примечание:
В дополнение к принятому ответу и с учетом Ральфа answer , я обнаружил, что хорошая идея сделать обе оболочки одним git.
- Удалить Git из bash, используя sudo apt remove git.
- Добавить path of git.exe в $ PATH of bash.
- Для простоты используйте alias git='git.exe', чтобы иметь возможность использовать Git, как раньше.

Вы можете сделать это для других вещей, которые могут столкнуться с этой проблемой, таких как python и так далее.

Ответы [ 3 ]

0 голосов
/ 07 февраля 2019

Короче говоря: core.autocrlf отличается в обеих средах.Это объясняет, почему на powershell сообщается, что файлы полностью отличаются (удаление всего содержимого и повторное добавление его точно таким же образом ... потому что это изменяет EOL этих строк).Чтобы избежать этого, используйте это на .gitattributes: * -text.Если при этом проблема остается, это , вероятно , поскольку файл уже изменил свой формат EOL в рабочем дереве.Попробуйте переключить его обратно на то, что было на HEAD, и тогда файл должен исчезнуть из состояния git.

0 голосов
/ 07 февраля 2019

Хотя принятый ответ показывает, как решить эту проблему, я бы дал другой совет:

Либо используйте git на Powershell или git на Bash.Не смешивайте при управлении одной и той же рабочей копией.

Обновление:

(Скорее всего) нормально использовать git на Powershell и других инструментах git на основе Windows(вы упомянули gitKraken и Android Studio в комментарии).

Насколько я понимаю, bash и git на Bash происходят из подсистемы Windows для Linux.Поэтому они будут использовать разные стили EOL.

0 голосов
/ 07 февраля 2019

В дополнение к наличию двух разных версий Git, вы должны проверить конфиги в обоих сеансах:

git config -l --show-origin

Это может показывать не только разные конфиги, но и разные конфиги файлы (например, когда HOME отличается между обоими, или когда системная конфигурация отличается между отдельными установками Git)

В вашей настройке присутствие core.autocrlf=true во вторых настройках объясняет вывод git diff.
Убедитесь, что набрали: git config --global core.autocrlf false в обеих оболочках.

В любом случае, попробуйте использовать упрощенный PATH PortableGit-2.20.1-64-bit.7z.exe Git без сжатия в любом местевы хотите), а затем вызовите git bash в этом CMD с указанным упрощенным PATH: результат должен быть таким же.

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%
...