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

quelque part (autour de la 1.6.x libère, je pense) git est devenu conscient des changements à l'intérieur des sous-modules. 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

faites que ça s'arrête.

Edit:

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

puis-je mettre ça dans ~/.gitconfig ? De mon point de départ, il semble que je ne puisse pas, et je n'ai rien vu de prometteur en parcourant le patch. (Je suppose que je peux toujours faire un alias.)

106
demandé sur kch 2010-07-13 23:47:59

9 réponses

il y a même une possibilité de définir le mode Ignorer pour chaque sous-module ajouté dans le .fichier gitmodules.

juste aujourd'hui, j'ai rencontré ce problème et 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, c':

une fois que vous avez ajouté un sous-module il y aura un fichier nommé .gitmodules dans la racine de votre dépôt

il suffit d'ajouter une ligne à ce .gitmodules fichier:

[submodule "bundle/fugitive"]
    path = bundle/fugitive
    url = git://github.com/tpope/vim-fugitive.git
    ignore = dirty
152
répondu NilsHaldenwang 2013-01-05 12:26:39

mise à Jour: Voir (et upvote) nilshaldenwang 's réponse quant à la possibilité d'ajouter à la .gitmodules fichier de configuration de paramètre pour ignorer sale état d'un sous module.

ignore = dirty

Donc git 1.7.2 et comprend le --ignore-submodules option 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 dirty .

git status --ignore-submodules=dirty

j'utilise un alias parce que je suis paresseux:

alias gst='git status --ignore-submodules=dirty'
48
répondu kch 2017-05-23 12:34:48

il y a deux types d'avis de changement que vous pouvez supprimer.

le premier est untracked content qui se produit lorsque vous apportez des modifications à votre sous-module, mais que vous n'avez pas encore apportées. Le référentiel parent les remarque et git status les rapporte 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, une fois que vous propagez ces modifications, le dépôt parent encore une fois, prenez-en connaissance et signalez-les en conséquence:

modified:   modules/media (new commits)

si vous voulez supprimer ceux-ci aussi, vous devez ignorer all changements

[submodule "modules/media"]
   path = modules/media
   url = git@github.com:user/media.git
   ignore = all
46
répondu aleemb 2015-05-25 06:22:39

vous pouvez également utiliser

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

pour définir submodule.ignore = dirty dans votre fichier .git/config . --global affichera l'indicateur ignore dans votre ~/.gitconfig et s'appliquera à tous vos dépôts. Sans lui, il devrait être défini dans .git/config pour juste la pension dans laquelle vous êtes actuellement.

la seule documentation que je peux trouver sur ce est submodule.<name>.ignore au git-config docs . Je l'ai déplacé à partir d'un .gitmodules fichier dans mon ~/.gitconfig et il travaille toujours pour moi.

8
répondu kjell_ 2018-08-14 17:55:10

Comme vous le mentionnez, le patch git sous-module: ignorer sale submodules pour le résumé et le statut de est en train de se faire.

également annoncé dans le Git 1.7.2-rc2 release:

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

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

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

qui signifie:

git config --global diff.ignoreSubmodules dirty

concernant cette option n'est pas exactement la approche choisie pour l'instant :

après cette série , j'ai l'intention d'ajouter une option de configuration" ignore.gitmodules , qui peut être définie pour chaque sous-module à" tout"," sale"," non suivi " ou "Aucun" (la valeur par défaut).

" git diff " et " git status " utilisera la valeur de configuration pour chaque sous-module.

Utiliser " --ignore-submodule " l'emporte sur cette valeur par défaut (et le nouveau paramètre "none" y sera ajouté pour pouvoir outrepasser les paramètres de configuration).

et pour éviter d'avoir à faire " git submdule sync "chaque fois que cette option Change, je voudrais d'abord la rechercher dans .git/config .

S'il n'y est pas trouvé, il sera tiré de .gitmodules , s'il est présent.

donc les utilisateurs peuvent outrepasser le paramètre mais s'ils ne le font pas, en amont peut le changer facilement (par exemple quand un sous-modules .gitignore a été mis à jour de sorte que " ignore=untracked " n'est plus nécessaire il peut être supprimé).

De même, la commutation de branches aura un effet instantané si l'entrée ignore " dans .gitmodules est différente d'une branche à l'autre.


une autre approche pour faire le statut git (ou n'importe quelle commande git) pour ignorer un sous-module particulier est disponible avec Git 2.13 (T2 2017):

git config submodule.<name>.active false

voir plus à " ignorer les nouvelles propagations pour git sous-module ".

8
répondu VonC 2018-09-12 09:17:48

vous devez ajouter

ignorer = sale

to .gitmodules

5
répondu Roman 2011-11-28 08:08:06

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

$ git diff --ignore-submodules=dirty vendor
# no output
$ git status --ignore-submodules=dirty vendor
# On branch …
nothing to commit (working directory clean)

construire son 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
2
répondu kch 2010-07-13 20:35:57

vous pouvez ne pas vouloir ajouter ignore = dirty à .gitmodules , vous pouvez vouloir être plus sélectif au sujet des changements que vous vouliez ignorer.

pour ce faire, ajouter des motifs à .git/submodule_foo/bar/info/exclude , où submodule_foo/bar/ est le chemin du sous-module.

les motifs sont similaires aux motifs que vous ajouteriez à .gitignore , la racine étant le répertoire submodule. Par exemple, ce motif ignore le répertoire build dans le sous-module submodule_foo/bar/ :

# in .git/submodule_foo/bar/info/exclude:
/build/
1
répondu Flimm 2016-04-18 10:22:55

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

il suffit d'exécuter

git config --global diff.ignoreSubmodules dirty

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

1
répondu Devpool 2018-09-11 13:26:40