Git diff dit que le sous-projet est sale
Je viens d'exécuter un diff git, et j'obtiens la sortie suivante pour tous mes 10 sous-modules
diff --git a/.vim/bundle/bufexplorer b/.vim/bundle/bufexplorer
--- a/.vim/bundle/bufexplorer
+++ b/.vim/bundle/bufexplorer
@@ -1 +1 @@
-Subproject commit 8c75e65b647238febd0257658b150f717a136359
+Subproject commit 8c75e65b647238febd0257658b150f717a136359-dirty
Qu'est-ce que cela signifie? Comment puis-je résoudre ce problème?
9 réponses
Comme mentionné dans L'article de blog de Mark Longair les sous-modules Git ont expliqué ,
Les Versions 1.7.0 et ultérieures de git contiennent un changement gênant dans le comportement du sous-module git.
les sous-modules sont maintenant considérés comme Sales s'ils ont des fichiers modifiés ou des fichiers non suivis , alors qu'auparavant ce ne serait le cas que si HEAD dans le sous-module pointait vers le mauvais commit.La signification du signe plus (
+
) dans la sortie de git sous-module a changé, et la première fois que vous rencontrez cela, il faut un peu de temps pour comprendre ce qui ne va pas, par exemple en regardant dans les changelogs ou en utilisant git bisect sur git.git pour trouver le changement. Il aurait été beaucoup plus gentil aux utilisateurs d'introduire un symbole différent pour "à la version spécifiée, mais sale".
Vous pouvez le réparer par:
-
Valider ou annuler les modifications / évolutions dans chacun de vos sous-modules, avant de revenir à la repo parent (où le diff ne devrait plus signaler les fichiers "sales"). Pour annuler toutes les modifications apportées à votre sous-module juste
cd
dans le répertoire racine de votre sous-module et dogit checkout .
DotnetCarpenter commentaires que vous pouvez faire:
git submodule foreach --recursive git checkout .
Ou ajoutez
--ignore-submodules
à votregit diff
, pour ignorer temporairement ces sous-modules "sales".
Nouveau dans Git version 1.7.2
, Comme Noam les commentaires ci-dessous, cette question mentionne que, depuis git version 1.7.2, vous pouvez ignorer les sous-modules sales avec:
git status --ignore-submodules=dirty
Supprimer également le sous-module, puis exécuter git submodule init
et {[1] } fera évidemment l'affaire, mais peut ne pas toujours être approprié ou possible.
C'est le cas parce que le pointeur que vous avez pour le sous-module n'est pas ce qui est réellement dans le répertoire du sous-module. Pour résoudre ce problème, vous devez exécuter à nouveau git submodule update
:
Malheureusement, il ne semble pas y avoir d'options de configuration pour faire de "git diff --ignore-submodules" et "git status --ignore-submodules" la valeur par défaut globale (mais Voir aussi définir les drapeaux par défaut de git sur les commandes ). Vous pouvez cependant définir une option de configuration par défaut ignore
sur chaque sous-module individuel que vous souhaitez ignorer (pour git diff
et git status
), soit dans le fichier .git/config
(local uniquement) ou .gitmodules
(sera versionné par git). Par exemple:
[submodule "foobar"]
url = git@bitbucket.org:foo/bar.git
ignore = untracked
ignore = untracked
pour ignorer les fichiers non suivis, ignore = dirty
pour ignorer les fichiers modifiés, et ignore = all
ignorer s'engage également.
Il n'y a apparemment aucun moyen de le wildcard pour tous les sous-modules.
git submodule foreach --recursive git checkout .
Cela n'a pas fait l'affaire pour moi mais cela m'a donné une liste de fichiers (dans mon cas un seul) qui avaient été modifiés dans le sous-module (sans que je fasse quoi que ce soit là).
Donc, je pouvais me diriger vers le sous-module et git status m'a montré que ma tête était détachée - > git checkout master, git status pour voir à nouveau le fichier modifié, git checkout >filename
Un sous-module peut être marqué comme sale si les paramètres filemode sont activés et que vous avez modifié les autorisations de fichier dans le sous-arbre du sous-module.
Pour désactiver filemode dans un sous-module, vous pouvez modifier /.git/modules/chemin/vers/votre/sous-module/config et ajoutez
[core]
filemode = false
Si vous voulez ignorer tous les États sales, vous pouvez définir la propriété ignore = dirty
dans /.gitmodules fichier, mais je pense qu'il est préférable de désactiver uniquement filemode.
J'ai fini par supprimer le répertoire des sous-modules et l'initialiser à nouveau
cd my-submodule
git push
cd ../
rm -rf my-submodule
git submodule init
git submodule update
Dans mon cas, je n'étais pas sûr de ce qui avait causé cela, mais je savais que je voulais juste que les sous-modules soient réinitialisés à leur dernier commit distant et en faire avec. Cela impliquait de combiner les réponses de quelques questions différentes ici:
git submodule update --recursive --remote --init
Sources:
Comment puis-je revenir mes modifications à un git sous-module?
Un moyen facile de tirer le dernier de tous les sous-modules git
Pour ignorer tous les fichiers non suivis d'un sous-module, utilisez la commande suivante pour ignorer ces modifications.
git config --global diff.ignoreSubmodules dirty
Il ajoutera l'option de configuration suivante à votre configuration git locale:
[diff]
ignoreSubmodules = dirty
De Plus amples informations peuvent être trouvées ici