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?

177
demandé sur Adexe Rivera 2011-02-02 14:36:50

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 do git checkout .

    DotnetCarpenter commentaires que vous pouvez faire: git submodule foreach --recursive git checkout .

  • Ou ajoutez --ignore-submodules à votre git 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
213
répondu VonC 2017-05-23 12:10:44

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.

15
répondu user1178907 2016-02-22 13:20:49

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:

11
répondu Robin Ren 2014-05-15 06:19:25

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.

9
répondu Ralph Versteegen 2017-05-23 12:02:46
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

8
répondu JustABit 2016-02-22 13:19:50

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.

5
répondu dryobs 2016-02-22 13:20:18

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
4
répondu Szymon Wygnański 2017-04-10 13:18:59

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

0
répondu Adam Westbrook 2017-08-30 10:15:43

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

0
répondu Devpool 2018-09-11 13:19:08