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?
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".
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
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.
[~ # ~] 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.
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:
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.
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
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
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.
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?