web-dev-qa-db-fra.com

Git diff dit que le sous-projet est sale

Je viens de lancer un diff git, et je reçois la sortie suivante pour tous mes environ 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 ça veut dire? Comment je le répare?

205
mrwooster

Comme mentionné dans le blog de Mark Longair Git Submodules Explained ,

Les versions 1.7.0 et supé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 contiennent des fichiers modifiés ou des fichiers non suivis , alors que ce ne serait le cas auparavant que si HEAD dans le sous-module a indiqué le mauvais commit.

La signification du signe plus (+) Dans la sortie du sous-module git a changé et la première fois que vous rencontrez ce problème, il faut un peu de temps pour comprendre ce qui ne va pas, par exemple en parcourant les journaux des modifications. ou utilisez git bisect sur git.git pour trouver le changement. Il aurait été beaucoup plus aimable pour les utilisateurs d'introduire un symbole différent pour "à la version spécifiée, mais sale".

Vous pouvez le réparer en:

  • soit en validant ou en annulant les modifications/évolutions dans chacun de vos sous-modules, avant de revenir au référant parent (où le diff ne devrait plus signaler les fichiers "corrompus"). Pour annuler toutes les modifications apportées à votre sous-module, il suffit de cd dans le répertoire racine de votre sous-module, puis de procéder à la réalisation de git checkout .

    dotnetCarpentercommentaires que vous pouvez faire un: 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 Noamcommentaires ci-dessous , cette question mentionne que, depuis la version 1.7.2 de Git, vous pouvez ignorer les sous-modules corrompus avec:

git status --ignore-submodules=dirty
245
VonC

Supprimez également le sous-module, puis exécutez git submodule init et git submodule update va évidemment faire l'affaire, mais peut ne pas toujours être approprié ou possible.

18
user1178907

[~ # ~] edit [~ # ~] : cette réponse (et la plupart des autres) est obsolète. voir réponse de Devpool à la place .


A l'origine, il n'y avait pas d'options de configuration permettant de définir "git diff --ignore-submodules" et "git status --ignore-submodules" comme valeur globale par défaut (voir aussi Définition des indicateurs git par défaut pour les commandes ). Une alternative consiste à définir une option par défaut ignore config sur chaque sous-module que vous souhaitez ignorer (pour git diff Et git status), Soit dans le .git/config fichier (local seulement) ou .gitmodules (sera versionné par git). Par exemple:

[submodule "foobar"]
    url = [email protected]:foo/bar.git
    ignore = untracked

ignore = untracked Pour ignorer uniquement les fichiers non suivis, ignore = dirty Pour ignorer également les fichiers modifiés et ignore = all Pour ignorer également les validations. Il n'y a apparemment aucun moyen de le remplacer par un joker pour tous les sous-modules.

14
Ralph Versteegen

C’est le cas, car le pointeur que vous avez pour le sous-module n’est pas ce qui se trouve réellement dans le répertoire des sous-modules. Pour résoudre ce problème, vous devez exécuter git submodule update encore:

13
Robin Ren
git submodule foreach --recursive git checkout .

Cela n'a pas fonctionné 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 ne fasse rien là-bas).

Donc, je pouvais aller au sous-module et git status m'a montré que mon HEAD était détaché -> git checkout master, git status pour voir à nouveau le fichier modifié, git checkout> nom_fichier <, git tirez et tout va bien à nouveau.

8
JustABit

Pour ignorer tous les fichiers non suivis dans n'importe quel 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 locale git:

[diff]
  ignoreSubmodules = dirty

De plus amples informations peuvent être trouvées ici

7
Devpool

J'ai fini par supprimer le répertoire du sous-module et l'initialiser à nouveau

cd my-submodule
git Push
cd ../
rm -rf my-submodule
git submodule init
git submodule update
6
Szymon Wygnański

Un sous-module peut être marqué comme sale si les paramètres de mode fil sont activés et que vous avez modifié les autorisations de fichier dans la sous-arborescence du sous-module.

Pour désactiver le mode fil dans un sous-module, vous pouvez éditer /. Git/modules/chemin/vers/votre/sous-module/config et ajouter

[core]
  filemode = false

Si vous voulez ignorer tous les états sales, vous pouvez soit définir ignore = dirty propriété dans le fichier /. gitmodules, mais je pense qu'il est préférable de ne désactiver que filemode.

6
dryobs

Dans mon cas, je n'étais pas sûr de ce qui avait provoqué cela, mais je savais que je voulais simplement que les sous-modules soient réinitialisés à leur dernier commit à distance et que tout soit terminé. Cela impliquait de combiner les réponses de différentes questions ici:

git submodule update --recursive --remote --init

Sources:

Comment puis-je rétablir mes modifications en un sous-module git?

Moyen facile d’extraire tous les sous-modules Git

0
Adam Westbrook