Git: puis-je supprimer la liste des entrées de 'contenu modifié' / de sous-module sale dans status, diff, etc?

123

Quelque part (autour des versions 1.6.x, je pense), git a pris conscience des changements dans les sous-modules. Cela ne sert qu'à m'ennuyer:

Fournisseur de statut $ git | grep modifié:
# modifié: fournisseur / rails (contenu modifié)
$ git diff vendeur /
diff --git a / vendor / rails b / vendor / rails
--- a / vendeur / rails
+++ b / vendeur / rails
@@ -1 +1 @@
-Sous-projet commit 046c900df27994d454b7f906caa0e4226bb42b6f
+ Sous-projet commit 046c900df27994d454b7f906caa0e4226bb42b6f-dirty

Veuillez l'arrêter?

Éditer:

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

Puis-je mettre ça ~/.gitconfig? D'après mon initiale, 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.)

kch
la source
Je vois quelques correctifs dans la liste de diffusion git à ce sujet, datant de juin 2010. Donc j'espère que c'est dans une prochaine version. (google pour 'git "--ignore-submodules = dirty"')
kch
+1 pour expliquer pourquoi le message se produit!
dotancohen

Réponses:

175

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

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

L'essentiel:

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

Ajoutez simplement une ligne à ce .gitmodulesfichier:

[submodule "bundle/fugitive"]
    path = bundle/fugitive
    url = git://github.com/tpope/vim-fugitive.git
    ignore = dirty
NilsHaldenwang
la source
5
+1, mais j'ai inclus la partie principale de votre article de blog à votre réponse sur SO: votre lien externe peut devenir invalide un jour, contrairement aux réponses SO qui vivront éternellement (via SO dumps: blog.stackoverflow.com/2009/ 06 /… )
VonC
5
J'ai trouvé que j'avais besoin de valider le fichier .gitmodules avant de git statustravailler comme prévu. Vous avez également besoin d'au moins 1.7.4 ou mieux, je crois.
aleemb
Pour le .gitignorefichier, il existe une version privée appelée exclude, située dans .git/info/, qui n'est pas gérée par la version. Existe-t-il un fichier correspondant pour le .gitmodulesfichier, qui vous permettra de supprimer les modifications dans le sous-module uniquement dans votre instance du référentiel parent, sans apporter de modifications à .gitmodules?
HelloGoodbye
2
Je ne parviens pas à faire fonctionner cela avec un sous-module de suivi d'une branche. N'est-il pas pris en charge pour cela? `` `[submodule" smstack / ansible / hosts "] path = smstack / ansible / hosts url = https: // ... branch = master ignore = dirty` `` `` `` `` `` ``
Marc Abramowitz
1
@MarcAbramowitz Je suis tombé sur le même problème que je pense - avez-vous trouvé une solution à cela?
Sebastian G.Marinescu
61

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

La première est celle untracked contentqui 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 le git statussignale en conséquence:

modified: modules/media (untracked content)

Vous pouvez les supprimer avec:

[submodule "modules/media"]
   path = modules/media
   url = [email protected]:user/media.git
   ignore = dirty

Cependant, une fois que vous avez validé ces modifications, le référentiel parent en prendra à nouveau connaissance et les signalera en conséquence:

modified:   modules/media (new commits)

Si vous souhaitez également les supprimer, vous devez ignorer les allmodifications

[submodule "modules/media"]
   path = modules/media
   url = [email protected]:user/media.git
   ignore = all
Aleemb
la source
2
Pour le .gitignorefichier, il existe une version privée appelée exclude, située dans .git/info/, qui n'est pas gérée par la version. Existe-t-il un fichier correspondant pour le .gitmodulesfichier, qui vous permettra de supprimer les modifications dans le sous-module uniquement dans votre instance du référentiel parent, sans apporter de modifications à .gitmodules?
HelloGoodbye
1
HelloGoodbye: Si vous vérifiez .git / modules / $ MODULENAME / vous verrez ce qui semble être le répertoire .git pour ce module. La modification du fichier info / exclusion à cet emplacement fait le travail.
PaulW
1
La ignore = allpartie est utile.
Eric Wang
53

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

ignore = dirty

Donc git 1.7.2 est sorti et inclut l' --ignore-submodulesoption pour status.

De git help status:

--ignore-submodules [= <quand>]
    Ignorez les modifications apportées aux sous-modules lors de la recherche de modifications.
    <when> peut être "non suivi", "sale" ou "tout", ce qui
    est la valeur par défaut. Lorsque "non suivi" est utilisé, les sous-modules sont
    non considérés comme sales lorsqu'ils ne contiennent que des éléments non suivis
    contenu (mais ils sont toujours analysés pour le contenu modifié).
    L'utilisation de "dirty" ignore toutes les modifications apportées à l'arborescence de travail de
    sous-modules, seuls les changements apportés aux commits stockés dans le
    superprojet sont affichés (c'était le comportement avant
    1.7.0). L'utilisation de "tous" masque toutes les modifications apportées aux sous-modules (et
    supprime la sortie des résumés de sous-modules lorsque le
    config option status.submodulesummary est défini).

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'
kch
la source
2
Puisqu'il s'agit d'une réponse acceptée, je pense que vous devriez également ajouter la possibilité d'ajouter ignore=dirtydes entrées individuelles dans le .gitmodulesfichier ici.
Andriy Drozdyuk
14

Comme vous l'avez mentionné, le sous-module patch git: ignore les sous-modules sales pour le résumé et le statut est en cours d'élaboration.

Également annoncé dans la version Git 1.7.2-rc2 :

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

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

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

Sens:

git config --global diff.ignoreSubmodules dirty

Considérer cela comme une option n'est pas exactement l' 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éfinie pour chaque sous-module sur «tout», «sale», «non suivi» ou «aucun» (valeur par défaut).

" git diff" et " git status" utiliseront cette valeur de configuration pour chaque sous-module.
L'utilisation de " --ignore-submodule" remplace cette valeur par défaut (et le nouveau paramètre "aucun" y sera ajouté pour pouvoir remplacer les paramètres de configuration).

Et pour éviter d'avoir à faire " git submdule sync" chaque fois que cette option change, j'aimerais la rechercher en .git/configpremier.
S'il n'y est pas trouvé, il sera extrait de .gitmodules, s'il est présent.

Ainsi, les utilisateurs peuvent remplacer le paramètre, mais s'ils ne le font pas, l'amont peut le changer facilement (par exemple, lorsqu'un sous-module .gitignorea été mis à jour de sorte que " ignore=untracked" n'est plus nécessaire, il peut être supprimé).
Le changement de branche aura également un effet instantané si l' ignoreentrée « » dans .gitmodulesest différente entre les branches.


Une autre approche pour rendre git status (ou toute commande git) pour ignorer un sous-module particulier est disponible avec Git 2.13 (Q2 2017):

git config submodule.<name>.active false

Pour en savoir plus, consultez " Ignorer les nouveaux commits pour le sous-module git ".

VonC
la source
J'ai mis à jour la question avec un bit gitconfig. Juste un ping au cas où vous connaissez la réponse.
kch
@kch: J'ai mis à jour la réponse avec l'approche actuellement proposée pour stocker ce type de paramètre.
VonC
@drozzy: comme vous le mentionnez dans votre autre commentaire: " ignore = dirty"
VonC
1
@drozzy: J'ai voté pour et complété la réponse de nilshaldenwang avec le paramètre de configuration supplémentaire "ignore = dirty", j'ai édité la réponse officielle, en ajoutant un lien vers le message de nilshaldenwang.
VonC
Merci, rien de personnel, mais je voulais juste la réponse la plus utile en haut, ce qui m'a d'abord manqué!
Andriy Drozdyuk
11

Vous pouvez aussi utiliser

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

à définir submodule.ignore = dirtydans votre .git/configfichier. --globaldéfinira l'indicateur Ignorer dans votre ~/.gitconfiget s'appliquera à tous vos référentiels. Sans cela, il ne devrait s'installer que .git/configpour le dépôt dans lequel vous vous trouvez actuellement.

La seule documentation que je peux trouver à ce sujet se trouve submodule.<name>.ignoredans la documentation git-config . Je l'ai déplacé d'un fichier .gitmodules dans mon ~ / .gitconfig et cela fonctionne toujours pour moi.

kjell_
la source
@ PawełGościcki Je peux confirmer que cela fonctionne sur Git 2.0.0.
Ciro Santilli 郝海东 冠状 病 六四 事件 法轮功
6

Vous devez ajouter

ignorer = sale

à .gitmodules

romain
la source
Où dans .gitmodules l'ajoutez-vous?
Andriy Drozdyuk
@drozzy Vous l'ajoutez sous la section pour chaque sous-module que vous voulez ignorer, où les valeurs "path" et "url" sont définies.
jsdalton
2

Donc git v1.7.2-rc2 a ce que je veux:

$ git diff --ignore-submodules = vendeur sale
# pas de sortie
$ git status --ignore-submodules = vendeur sale
# Sur la branche…
rien à valider (répertoire de travail nettoyé)

Construire votre propre git howto:

# get git
git clone git://git.kernel.org/pub/scm/git/git.git git
cd git
git checkout v1.7.2-rc2

# make git. beware of setting prefix
make configure
./configure --prefix=/usr/local
make
sudo make install

# you REALLY don't want to `make doc`, use this instead
sudo make quick-install-man
sudo make quick-install-html
kch
la source
1
Je compte Gits sept ici: git clone git://git.kernel.org/pub/scm/git/git.git git.
dotancohen
2

J'ai répondu à cette question ici plus en détail.

Courez

git config --global diff.ignoreSubmodules dirty

pour ajouter une option de configuration locale pour ignorer ces changements.

Devpool
la source
1

Vous voudrez peut - être de ne pas ajouter ignore = dirtyà .gitmodules, vous voudrez peut - être plus sélectif sur les changements que vous vouliez ignorer.

Pour ce faire, ajoutez des modèles à .git/submodule_foo/bar/info/exclude, où se submodule_foo/bar/trouve le chemin du sous-module.

Les modèles sont similaires aux modèles que vous ajouteriez .gitignore, la racine étant le répertoire du sous-module. Par exemple, ce modèle ignore le buildrépertoire dans le sous-module submodule_foo/bar/:

# in .git/submodule_foo/bar/info/exclude:
/build/
Flimm
la source
3
Je pense que cela masquera également les changements à l'intérieur d'un sous-module. Je veux uniquement que les modifications soient masquées en dehors du sous-module. C'est bien s'ils apparaissent à l'intérieur, lorsque je travaille activement sur le sous-module.
Raphael Schweikert