Wie kann ich git log
nur Commits anzeigen, bei denen andere als die von mir angegebenen Dateien geändert wurden?
Mit git log
kann ich die Commits filtern, die ich für diejenigen sehe, die einen bestimmten Satz von Pfaden berühren. Ich möchte diesen Filter invertieren, damit nur festgeschrieben wird, dass andere als die angegebenen Berührungspfade aufgelistet werden.
Ich kann bekommen, was ich will
git log --format="%n/%n%H" --name-only | ~/filter-log.pl | git log --stdin --no-walk
wo filter-log.pl
ist:
#!/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";
}
}
außer ich möchte etwas etwas eleganteres als das.
Beachten Sie, dass ich nicht frage, wie Git die Dateien ignorieren soll. Diese Dateien sollten verfolgt und festgeschrieben werden. Es ist nur so, dass ich die meiste Zeit nicht daran interessiert bin, sie zu sehen.
Verwandte Frage: Wie man `git log --grep = <pattern>` invertiert oder wie man git logs anzeigt, die nicht mit einem Muster übereinstimmen Es ist dieselbe Frage, außer für Commit-Nachrichten und nicht für Pfade.
Forumsdiskussion zu diesem Thema aus dem Jahr 2008: Betreff : Ausschließen von Dateien aus git-diff Das sah vielversprechend aus, aber der Thread scheint ausgetrocknet zu sein.
!f() { git log ... | path/to/filter-log.pl "$@" | git log --stdin --no-walk; f
oder sogar diesen Pipeline-Teil in das Skript einbinden.find
Verzeichnisse heraus, deren Commits ich nicht sehen möchte. Wenn ich Protokolleinträge von Commits, die in das Stammverzeichnis eingegeben wurden, ignorieren wollte,SiteConfig
würde ich sagen:git log `find . -type d -mindepth 1 -maxdepth 1 ! -name *SiteConfig`
git log --oneline --format=%s -- . ":!sub"
wird funktionieren (mit der Pathspec-Magie:(exclude)
und ihrer Kurzform:!
)Antworten:
Es ist jetzt implementiert (git 1.9 / 2.0, Q1 2014) mit der Einführung pathspec magic
:(exclude)
und seiner Kurzform:!
in commit ef79b1f und commit 1649612 von Nguyễn Thái Ngọc Duy (pclouds
) . Die Dokumentation finden Sie hier .Sie können jetzt alles außer dem Inhalt eines Unterordners protokollieren:
Oder Sie können bestimmte Elemente in diesem Unterordner ausschließen
eine bestimmte Datei:
jede gegebene Datei innerhalb
sub
:Sie können diesen Ausschlussfall unempfindlich machen!
Wie Kenny Evitt bemerkte
Hinweis: Git 2,13 (Q2 2017) ein Synonym hinzufügen wird
^
zu!
Siehe Commit 859b7f1 , Commit 42ebeb9 (08. Februar 2017) von Linus Torvalds (
torvalds
) .(Zusammengeführt von Junio C Hamano -
gitster
- in Commit 015fba3 , 27. Februar 2017)^
Fügen Sie daher ' ' als alternativen Alias für einen ausschließenden Pfadspezifikationseintrag hinzu.Beachten Sie, dass vor Git 2.28 (Q3 2020) die Verwendung einer negativen Pfadspezifikation beim Sammeln von Pfaden, einschließlich nicht verfolgter Pfade im Arbeitsbaum, unterbrochen wurde.
Siehe Commit f1f061e (05. Juni 2020) von Elijah Newren (
newren
) .(Zusammengeführt von Junio C Hamano -
gitster
- in Commit 64efa11 , 18. Juni 2020)quelle
":(exclude)pathPattern1" ":(exclude)pathPattern2"
mehrere Ordner / Dateien ignoriert werden.':!sub'
stattdessen, umbash: ... event not found
Fehler zu vermeiden .":\!sub"
funktioniert nichtgit help glossary
(die ich ingit help -g
[die ich in vorgeschlagen gefunden habegit help
] aufgelistet gefunden habe ).tl; dr:
shopt -s extglob && git log !(unwanted/glob|another/unwanted/glob)
Wenn Sie Bash verwenden , sollten Sie die erweiterte Globbing- Funktion verwenden können, um nur die Dateien abzurufen , die Sie benötigen:
Sie können dies mit
globstar
für rekursive Aktionen kombinieren .quelle
Sie können die Änderungen in einer Datei vorübergehend ignorieren mit:
In Zukunft werden alle Änderungen an diesen Dateien durchgeführt werden , ignoriert werden
git status
,git commit -a
usw. Wenn Sie bereit sind , diese Dateien zu begehen, ist es gerade umgekehrt:und wie gewohnt festschreiben.
quelle
git update-index --skip-worktree
bewirkt nichtgit log
, dass bereits vorgenommene Commits gefiltert werden.