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
Où 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é.
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 éviterbash: ... 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.
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.
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.