Faire en sorte que 'git log' ignore les modifications pour certains chemins

Comment puis-je faire en sorte que git log n'affiche que les validations qui ont changé les fichiers autres que ceux que je spécifie?

Avec git log, je peux filtrer les commits que je vois à ceux qui touchent un ensemble donné de chemins. Ce que je veux, c'est inverser ce filtre afin que seuls les chemins tactiles autres que ceux spécifiés soient listés.

Je peux obtenir ce que je veux avec

git log --format="%n/%n%H" --name-only | ~/filter-log.pl | git log --stdin --no-walk

filter-log.pl est:

#!/usr/bin/perl
use strict;
use warnings;

$/ = "n/n";
<>;

while (<>) {
    my ($commit, @files) = split /n/, $_;

    if (grep { $_ && $_ !~ m[^(/$|.etckeeper$|lvm/(archive|backup)/)] } @files) {
        print "$commitn";
    }
}

Sauf que je veux quelque chose de plus élégant que ça.

Notez que je suis pas demander comment faire git d'ignorer les fichiers. Ces fichiers devraient être suivis et engagé. C'est juste que, la plupart du temps, je ne suis pas intéressé à les voir.

Question connexe: comment inverser 'git log --grep= ' ou comment afficher les journaux git qui ne correspondent pas à un pattern c'est la même question sauf pour les messages de validation plutôt que les chemins.

Discussion du Forum sur ce sujet à partir de 2008: Re: exclure les fichiers de git-diff {[25] } cela semblait prometteur, mais le fil semble avoir séché.

87
git
demandé sur Community 2011-04-16 10:52:53

3 réponses

, Il est mis en œuvre aujourd'hui (git 1.9/2.0, T1 2014), avec l'introduction pathspec la magie :(exclude) et sa forme courte :! dans commettre ef79b1f et commettre 1649612, par Nguynn Thái NGCC Duy (pclouds).

Vous pouvez maintenant enregistrer tout sauf un contenu de sous-dossier:

git log -- . ":(exclude)sub"
git log -- . ":!sub"

Ou vous pouvez exclure des éléments spécifiques dans ce sous-dossier

  • Un fichier spécifique:

    git log -- . ":(exclude)sub/sub/file"
    git log -- . ":!sub/sub/file"
    
  • Un fichier donné dans sub:

    git log -- . ":(exclude)sub/*file"
    git log -- . ":!sub/*file"
    git log -- . ":(exclude,glob)sub/*/file"
    

Vous pouvez rendre cette exclusion insensible à la casse!

git log -- . ":(exclude,icase)SUB"

Comme Kenny Evitt a noté

Si vous exécutez Git dans un shell Bash, utilisez ':!sub' ou ":\!sub" à la place pour éviter bash: ... event not found erreurs


Remarque: Git 2.13 (T2 2017) permettra d'ajouter un synonyme ^à !

Voir commettre 859b7f1, s'engager 42ebeb9 (08 Février 2017) par Linus Torvalds (torvalds).
(Regroupées par Junio C Hamano -- gitster -- dans commettre 015fba3, 27 Février 2017)

Pathspec magie: ajouter '^ " comme alias pour '!'

Le choix de '! ' pour un pathspec négatif finit non seulement par ne pas correspondre ce que nous faisons pour les révisions, c'est aussi un personnage horrible pour shell expansion car il a besoin de citer.

Ajoutez donc ' ^' comme alias alternatif pour une entrée excluding pathspec.

147
répondu VonC 2017-05-23 11:54:53

Tl;dr: shopt -s extglob && git log !(unwanted/glob|another/unwanted/glob)

Si vous utilisez Bash, vous devriez être en mesure d'utiliser l'étendue d'expansion pour obtenir uniquement les fichiers dont vous avez besoin:

$ cd -- "$(mktemp --directory)" 
$ git init
Initialized empty Git repository in /tmp/tmp.cJm8k38G9y/.git/
$ mkdir aye bee
$ echo foo > aye/foo
$ git add aye/foo
$ git commit -m "First commit"
[master (root-commit) 46a028c] First commit
 0 files changed
 create mode 100644 aye/foo
$ echo foo > bee/foo
$ git add bee/foo
$ git commit -m "Second commit"
[master 30b3af2] Second commit
 1 file changed, 1 insertion(+)
 create mode 100644 bee/foo
$ shopt -s extglob
$ git log !(bee)
commit ec660acdb38ee288a9e771a2685fe3389bed01dd
Author: My Name <jdoe@example.org>
Date:   Wed Jun 5 10:58:45 2013 +0200

    First commit

Vous pouvez combiner ceci avec globstar pour une action récursive.

4
répondu l0b0 2013-06-05 09:01:41

Vous pouvez temporairement ignorer les changements dans un fichier avec:

git update-index --skip-worktree path/to/file

Aller de l'avant, toutes les modifications apportées à ces fichiers seront ignorées par git status, git commit -a, etc. Lorsque vous êtes prêt à valider ces fichiers, inversez-les simplement:

git update-index --no-skip-worktree path/to/file

Et commit comme d'habitude.

0
répondu rubysolo 2011-06-24 19:04:24