4
votes

La situation de Git diffère dans Windows bash et la ligne de commande Windows

J'ai un dépôt git dans mon système.
Lorsque j'entre git status à l'aide de Windows PowerShell , j'obtiens un résultat et lorsque je le saisis dans windows bash , j'obtiens un résultat différent.

Voir l'image pour plus de détails.

 entrez la description de l'image ici

Comme vous pouvez le voir git status dans Windows PowerShell indique Rien à valider , tandis que le même état git dans Windows bash indique que vous avez des modifications non organisées.

Voici un résultat de sortie de git version dans les deux:
PowerShell Windows : git version 2.18.0.windows.1
Windows bash : git version 2.7.4

Et voici un git diff .idea / gradle.xml :
Powershell :
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

Comme vous pouvez le voir, c'est complètement différent.

Voici la sortie de 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 final:

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
~

Qu'est-ce que à l'origine de ce problème et comment puis-je le résoudre?

Merci d'avance.

Remarque:
En plus de la réponse acceptée et en considérant la réponse de Ralf, j'ai trouvé que faire en sorte que les deux shells utilisent un git est une bonne idée.
- Supprimer Git de bash en utilisant sudo apt remove git .
- Ajouter chemin de git.exe dans $ PATH de bash.
- Pour plus de simplicité, utilisez alias git = 'git.exe' pour pouvoir utiliser Git comme avant.

Vous pouvez le faire pour d'autres choses qui pourraient rencontrer ce problème comme python et ainsi de suite.


19 commentaires

J'ai vu ce problème apparaître lors de l'utilisation de git de «git for windows», puis de «git through cygwin». Je suppose que le problème est de savoir comment les deux binaires peuvent voir l'indicateur d'exécution des fichiers. Quelle est la sortie de git diff .idea / gradle.xml ? De plus, quelle est la sortie de la version de git pour les deux environnements ? Pouvez-vous ajouter la sortie des deux à la question d'origine?


@TimBiegeleisen quoi ??? git version et git diff .idea / gradle.xml ? Où?


Oh ... je n'ai pas vu diff là-dedans, oui, ce serait bien à voir aussi.


@ eftshift0 Intéressant. Pour Windows, git version renvoie: git version 2.18.0.windows.1 . Et pour windows bash ce sera git version 2.7.4


git diff pour gradle.xml est vide pour windows powershell , alors qu'il a toutes les différences dans bash


Et les diff? Je parie que le problème est lié au drapeau + x des fichiers (bien que cela puisse être lié aux configurations, comme un git utilise auto.crlf et l'autre pas? Toutes sortes de choses folles peuvent arriver). Peut-être que vérifier également git config -l pour les deux pourrait aider un peu,


Que voulez-vous dire par toutes les différences ? Comme le fichier est complètement supprimé et remplacé par le même contenu?


Premièrement: lequel a raison? Le fichier .idea / gradle.xml ressemble à un fichier qui devrait normalement être ignoré. Se pourrait-il que .gitignore utilise des fins de ligne CRLF et que le git dans bash est incapable de le comprendre?


À propos, toutes ces sorties devraient être ajoutées à la question initiale.


@Ralf: Cela n'a pas d'importance. Les résultats ne devraient pas différer, n'est-ce pas?


Non, les sorties ne peuvent pas différer.


@Malv .... Ils pourraient différer. Nous essayons de comprendre pourquoi ils le font pour que cela puisse être évité.


Pouvez-vous essayer ça? Ajoutez ceci à .gitattributes: * -text , puis réessayez git status sur les deux. Ensuite, vous pouvez le retirer.


Si cela résout le problème, c'est parce que la configuration de auto.crlf (ou quelque chose comme ça) est différente entre les deux gits. En utilisant * -text sur .gitattributes, vous dites à git d'éviter toute conversion EOL et de gérer les fichiers "tels quels".


Et puis je l'écrirai comme une réponse et @Malv la votera et la vérifiera comme la réponse , non?


@ eftshift0 Non. l'ajout de * -text n'a pas fait de différence, sauf que les deux disent que .gitattributes est créé


:( Quelle est la sortie de git config -l sur les deux? Cela devrait être ajouté à la question d'origine.


La valeur de auto.crlf est différente entre les deux. Je suppose que c'est défini à l'échelle mondiale. Pouvez-vous le définir sur le repo?


Mais c'est exactement ce que nous avons essayé de faire (remplacer cette valeur) en utilisant .gitattributes. Peut-être que les fichiers ont déjà été modifiés sur l'arbre de travail par l'un des deux gits? Pouvez-vous vérifier cela également? file .idea / gradle.xml sur les deux environnements, ainsi que git show HEAD: .idea / gradle.xml | fichier - . Nous pourrions découvrir que le fichier a déjà changé son format EOL déjà dans l'arborescence de travail.


3 Réponses :


1
votes

En plus d'avoir deux versions différentes de Git, vous devriez vérifier les configurations dans les deux sessions, avec:

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%

Cela peut afficher non seulement différentes configurations, mais différents fichiers de configuration (comme lorsque HOME diffère entre les deux, ou lorsque la configuration du système diffère entre les installations Git séparées)

Dans votre configuration, la présence de core.autocrlf = true dans les deuxièmes paramètres explique la sortie de git diff .
Assurez-vous de taper: git config --global core.autocrlf false dans les deux shell.

Dans tous les cas, essayez d'utiliser un PATH simplifié (avec un PortableGit-2.20.1-64-bit.7z.exe Git décompressé où que vous soyez want), puis appelez git bash dans ce CMD avec ledit PATH simplifié: le résultat devrait alors être le même.

git config -l --show-origin


1 commentaires

Les fichiers sont déjà suivis, il ne s'agit donc pas de les ignorer par git.



1
votes

En bref: core.autocrlf est différent dans les deux environnements. Cela explique pourquoi sur PowerShell, il vous dit que les fichiers sont complètement différents (en supprimant tout le contenu et en l'ajoutant exactement de nouveau ... car cela change la fin de vie de ces lignes). Le moyen d'éviter que cela ne se produise est d'utiliser ceci sur .gitattributes: * -text . Si le problème persiste, c'est probablement parce que le fichier a déjà changé son format EOL dans l'arborescence de travail. Essayez de le remettre à ce qu'il était sur HEAD, puis le fichier devrait disparaître de l'état git.


2 commentaires

En comparant la sortie de l'existant et celle modifiée dans la commande git diff , vous verrez que seul ^ M est la différence entre. Ainsi, en l'ignorant en utilisant .gitattributes et * -text , il a résolu le problème.


Et cela n'a pas fonctionné au début, car il était déjà modifié. Donc, revenir à HEAD l'a aidé. Merci pour l'aide.



1
votes

Bien que la réponse acceptée montre comment résoudre ce problème, je donnerais un autre conseil:

Utilisez git sur Powershell ou git sur Bash . Ne mélangez pas lorsque vous gérez la même copie de travail.

Mise à jour:

Il est (très probablement) correct d'utiliser git sur Powershell et d'autres outils git basés sur Windows (vous avez mentionné gitKraken et Android Studio dans le commentaire).

Je crois comprendre que bash et git on Bash proviennent du sous-système Windows pour Linux. Ils prendront donc un style EOL différent.


2 commentaires

J'utilise gitKraken et parfois git du studio Android . Je suppose qu'ils utilisent git de windows. Donc, si j'utilise git dans le bash, ce serait un mélange. La mise à jour des deux gits ou l'utilisation d'un git portable devrait résoudre le problème, non?


@Malv je ne sais pas.