Comment puis-je git log
afficher uniquement les commits qui ont modifié des fichiers autres que ceux que je spécifie?
Avec git log
, je peux filtrer les commits que je vois sur ceux qui touchent un ensemble donné de chemins. Ce que je veux, c'est inverser ce filtre afin que seuls les commits qui touchent des chemins autres que ceux spécifiés soient répertorié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 "$commit\n";
}
}
sauf que je veux quelque chose d'un peu plus élégant que ça.
Notez que je ne demande pas comment faire ignorer les fichiers par git. Ces fichiers doivent être suivis et validés. C'est juste que, la plupart du temps, je ne suis pas intéressé à les voir.
Question connexe: Comment inverser `git log --grep = <pattern>` ou Comment afficher les journaux git qui ne correspondent pas à un modèle C'est la même question sauf pour les messages de validation plutôt que pour les chemins.
Forum de discussion sur ce sujet à partir de 2008: Re: Exclure des fichiers de git-diff Cela avait l'air prometteur mais le fil semble s'être tari.
!f() { git log ... | path/to/filter-log.pl "$@" | git log --stdin --no-walk; f
, ou même encapsuler cette partie de pipeline dans le script.find
pour filtrer les répertoires dont je ne veux pas voir les commits. Si je voulais ignorer les entrées de journal des commits effectués dans le répertoire racine,SiteConfig
je dirais:git log `find . -type d -mindepth 1 -maxdepth 1 ! -name *SiteConfig`
git log --oneline --format=%s -- . ":!sub"
fonctionnera (avec la magie pathspec:(exclude)
et sa forme courte:!
)Réponses:
Il est implémenté maintenant (git 1.9 / 2.0, Q1 2014) avec l'introduction pathspec magic
:(exclude)
et sa forme courte:!
dans commit ef79b1f et commit 1649612 , par Nguyễn Thái Ngọc Duy (pclouds
) , la documentation peut être trouvée ici .Vous pouvez maintenant tout consigner sauf le contenu d'un sous-dossier:
Ou vous pouvez exclure des éléments spécifiques dans ce sous-dossier
un fichier spécifique:
tout fichier donné dans
sub
:Vous pouvez rendre cette exclusion insensible à la casse!
Comme l'a noté Kenny Evitt
Remarque: Git 2.13 (Q2 2017) ajoutera un synonyme
^
à!
Voir commit 859b7f1 , commit 42ebeb9 (08 février 2017) par Linus Torvalds (
torvalds
) .(Fusionné par Junio C Hamano -
gitster
- in commit 015fba3 , 27 fév 2017)Ajoutez donc «
^
» comme alias alternatif pour une entrée de spécification de chemin d'exclusion.Notez qu'avant Git 2.28 (T3 2020), l'utilisation de pathspec négative, lors de la collecte des chemins, y compris ceux non suivis dans l'arbre de travail, était interrompue.
Voir commit f1f061e (05 juin 2020) par Elijah Newren (
newren
) .(Fusionné par Junio C Hamano -
gitster
- dans commit 64efa11 , 18 juin 2020)la source
":(exclude)pathPattern1" ":(exclude)pathPattern2"
, ignorant ainsi plusieurs dossiers / fichiers.':!sub'
plutôt pour éviter lesbash: ... event not found
erreurs .":\!sub"
ne fonctionne pas.git help glossary
(que j'ai trouvé dansgit help -g
[ce que j'ai trouvé suggéré dansgit help
]).tl; dr:
shopt -s extglob && git log !(unwanted/glob|another/unwanted/glob)
Si vous utilisez Bash, vous devriez pouvoir utiliser la fonction de globalisation étendue pour obtenir uniquement les fichiers dont vous avez besoin:
Vous pouvez combiner cela avec
globstar
pour une action récursive.la source
Vous pouvez ignorer temporairement les modifications d'un fichier avec:
À l' avenir, toutes les modifications apportées à ces fichiers seront ignorés par
git status
,git commit -a
etc. Lorsque vous êtes prêt à commettre ces fichiers, juste inverser:et engagez-vous normalement.
la source
git update-index --skip-worktree
n'entraîne pas legit log
filtrage des commits déjà effectués.