134 votes

Git : puis-je supprimer la liste des entrées du sous-module 'modified content'/dirty dans status, diff, etc ?

Depuis un certain temps (autour des versions 1.6.x, je pense), git a pris conscience des changements à l'intérieur des submodules. Cela ne sert qu'à m'ennuyer :

$ git status vendor | grep modified:
#       modified:   vendor/rails (modified content)
    $ git diff vendor/
diff --git a/vendor/rails b/vendor/rails
--- a/vendor/rails
+++ b/vendor/rails
@@ -1 +1 @@
-Subproject commit 046c900df27994d454b7f906caa0e4226bb42b6f
+Subproject commit 046c900df27994d454b7f906caa0e4226bb42b6f-dirty

S'il vous plaît, faites que ça s'arrête ?

Edit :

Ok, donc j'ai une réponse. Maintenant j'ai une autre question :

Je peux mettre ça dans ~/.gitconfig ? D'après mes initiales, il semble que je ne peux pas, et je n'ai rien vu de prometteur en parcourant le patch. (Je suppose que je peux toujours créer un alias).

0 votes

Je vois des correctifs dans la liste de diffusion git à ce sujet, datant de juin 2010. Donc avec un peu de chance, c'est dans une prochaine version. (chercher sur google 'git "--ignore-submodules=dirty"')

0 votes

+1 pour expliquer pourquoi le message se produit !

187voto

NilsHaldenwang Points 1295

Il est même possible de définir le mode d'ignorance pour chaque sous-module ajouté dans le fichier .gitmodules.

Aujourd'hui même, j'ai rencontré ce problème et j'ai immédiatement écrit un article sur mon blog à ce sujet après avoir trouvé une solution : Comment ignorer les changements dans les submodules git

L'essentiel :

Une fois que vous avez ajouté un sous-module, il y aura un fichier nommé .gitmodules dans la racine de votre référentiel

Il suffit d'ajouter une ligne à cela .gitmodules fichier :

[submodule "bundle/fugitive"]
    path = bundle/fugitive
    url = git://github.com/tpope/vim-fugitive.git
    ignore = dirty

5 votes

+1, mais j'ai inclus l'essentiel de votre billet de blog à votre réponse sur SO : votre lien externe peut devenir invalide un jour, contrairement aux réponses sur SO qui vivront éternellement (grâce aux dumps de SO : blog.stackoverflow.com/2009/06/ )

5 votes

J'ai découvert que j'avais besoin de valider le fichier .gitmodules avant de git status a fonctionné comme prévu. Vous avez également besoin d'au moins la version 1.7.4 ou d'une version plus récente, je crois.

0 votes

Pour le .gitignore il existe une version privée appelée exclude situé à .git/info/ qui n'est pas une version gérée. Existe-t-il un fichier correspondant pour le .gitmodules qui vous permettra de supprimer les modifications du sous-module uniquement dans votre instance du référentiel parent, sans avoir à modifier le fichier .gitmodules ?

72voto

aleemb Points 12138

Il existe deux types d'avis de modification que vous pouvez supprimer.

Le premier est untracked content ce qui se produit lorsque vous apportez des modifications à votre sous-module mais que vous ne les avez pas encore validées. Le référentiel parent les remarque et git status le signale en conséquence :

modified: modules/media (untracked content)

Vous pouvez les supprimer avec :

[submodule "modules/media"]
   path = modules/media
   url = git@github.com:user/media.git
   ignore = dirty

Cependant, dès que vous livrez ces changements, le référentiel parent en prend note et les signale en conséquence :

modified:   modules/media (new commits)

Si vous voulez les supprimer également, vous devez ignorer les éléments suivants all changements

[submodule "modules/media"]
   path = modules/media
   url = git@github.com:user/media.git
   ignore = all

2 votes

Pour le .gitignore il existe une version privée appelée exclude situé à .git/info/ qui n'est pas une version gérée. Existe-t-il un fichier correspondant pour le .gitmodules qui vous permettra de supprimer les modifications du sous-module uniquement dans votre instance du référentiel parent, sans avoir à modifier le fichier .gitmodules ?

1 votes

HelloGoodbye : Si vous vérifiez .git/modules/$MODULENAME/ vous verrez ce qui semble être le répertoire .git pour ce module. Modifier le fichier info/exclude à cet endroit fait le travail.

1 votes

Le site ignore = all est utile.

55voto

kch Points 25855

Mise à jour : Voir (et upvote) nilshaldenwang 's réponse concernant la possibilité d'ajouter au .gitmodules un paramètre de configuration pour ignorer l'état sale d'un sous-module donné.

ignore = dirty

La version 1.7.2 de git est donc sortie et comprend la --ignore-submodules option pour status .

De git help status :

\--ignore-submodules\[=<when>\]
    Ignore changes to submodules when looking for changes.
    <when> can be either "untracked", "dirty" or "all", which
    is the default. When "untracked" is used submodules are
    not considered dirty when they only contain untracked
    content (but they are still scanned for modified content).
    Using "dirty" ignores all changes to the work tree of
    submodules, only changes to the commits stored in the
    superproject are shown (this was the behavior before
    1.7.0). Using "all" hides all changes to submodules (and
    suppresses the output of submodule summaries when the
    config option status.submodulesummary is set).

La valeur que je veux est dirty .

git status --ignore-submodules=dirty

J'utilise un alias parce que je suis paresseux :

alias gst='git status --ignore-submodules=dirty'

3 votes

Puisque c'est une réponse acceptée, je pense que vous devriez également ajouter l'option d'ajout de ignore=dirty à des entrées individuelles dans .gitmodules ici.

18voto

VonC Points 414372

Comme vous le mentionnez, le patch git submodule : ignore les submodules sales pour le résumé et le statut est en cours de réalisation.

Également annoncé dans le Git 1.7.2-rc2 libération :

Git v1.7.2 Release Notes (draft)
================================

Updates since v1.7.1
--------------------

" git status " appris " --ignore-submodules option ".

C'est-à-dire :

git config --global diff.ignoreSubmodules dirty

Considérer cela comme une option n'est pas exactement la meilleure solution. approche choisie pour l'instant :

Après cette série, je prévois d'ajouter une option de configuration ' ignore à .gitmodules qui peut être défini pour chaque sous-module comme "all", "dirty", "untracked" ou "none" (par défaut).

" git diff " et " git status "Cette valeur de configuration sera utilisée pour chaque sous-module.
Utilisation " --ignore-submodule "Le paramètre "none" sera ajouté pour permettre de remplacer les paramètres de configuration.

Et pour éviter de devoir faire " git submdule sync " à chaque fois que cette option change, j'aimerais la rechercher en .git/config d'abord.
S'il ne s'y trouve pas, il sera pris dans la base de données de l'UE. .gitmodules si elle est présente.

Ainsi, les utilisateurs peuvent passer outre le paramètre mais s'ils ne le font pas, l'amont peut le modifier facilement (par exemple, lorsqu'un sous-module .gitignore a été mis à jour afin que " ignore=untracked " n'est plus nécessaire, il peut être supprimé).
Le changement de branche aura également un effet instantané si le ' ignore L'entrée dans .gitmodules est différent selon les branches.


Une autre approche pour faire en sorte que git status (ou toute commande git) ignore un sous-module particulier est disponible avec Git 2.13 (Q2 2017) :

git config submodule.<name>.active false

Voir plus à " Ignorer les nouveaux commits pour le submodule git ".

0 votes

J'ai mis à jour la question avec une partie de gitconfig. J'envoie juste un message au cas où vous connaîtriez la réponse.

0 votes

@kch : J'ai mis à jour la réponse avec l'approche actuellement proposée pour stocker ce type de paramètre.

0 votes

@drozzy : comme vous le mentionnez dans votre autre commentaire : " ignore = dirty "

12voto

kjell_ Points 83

Vous pouvez également utiliser

% git config [--global] submodule.ignore dirty

pour fixer submodule.ignore = dirty dans votre .git/config fichier. --global mettra l'indicateur d'ignorance dans votre ~/.gitconfig et l'appliquer à tous vos référentiels. Sans cela, il devrait être placé dans .git/config pour le seul repo dans lequel vous vous trouvez actuellement.

La seule documentation que je peux trouver à ce sujet est submodule.<name>.ignore au Documentation sur git-config . Je l'ai déplacé d'un fichier .gitmodules vers mon ~/.gitconfig et cela fonctionne toujours pour moi.

0 votes

@PaweGocicki Je peux confirmer que cela fonctionne sur Git 2.0.0.

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X