Jak mogę git log
pokazać tylko zmiany, które zmieniły pliki inne niż te, które określę?
Dzięki temu git log
mogę filtrować zmiany, które widzę, do tych, które dotykają danego zestawu ścieżek. To, czego chcę, to odwrócić ten filtr, aby tylko zatwierdzić te ścieżki dotykania inne niż określone.
Mogę dostać to, czego chcę
git log --format="%n/%n%H" --name-only | ~/filter-log.pl | git log --stdin --no-walk
gdzie filter-log.pl
jest:
#!/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";
}
}
poza tym, że chcę czegoś bardziej eleganckiego.
Zauważ, że nie pytam, jak sprawić, by git ignorował pliki. Te pliki powinny być śledzone i zatwierdzane. Po prostu przez większość czasu nie jestem zainteresowany ich oglądaniem.
Powiązane pytanie: Jak odwrócić `git log --grep = <pattern>` lub Jak wyświetlić dzienniki git, które nie pasują do wzorca To to samo pytanie, z wyjątkiem komunikatów o zatwierdzeniach, a nie ścieżek.
Dyskusja na forum na ten temat z 2008 roku: Re: Wykluczanie plików z git-diff Wygląda to obiecująco, ale wątek wydaje się wysychać.
!f() { git log ... | path/to/filter-log.pl "$@" | git log --stdin --no-walk; f
, lub nawet zawinąć tę część potoku do skryptu.find
do odfiltrowywania katalogów, których zatwierdzeń nie chcę widzieć. Gdybym chciał zignorować wpisy dziennika dotyczące zatwierdzeń dokonanych w katalogu głównymSiteConfig
, powiedziałbym:git log `find . -type d -mindepth 1 -maxdepth 1 ! -name *SiteConfig`
git log --oneline --format=%s -- . ":!sub"
będzie działać (z magią pathspec:(exclude)
i jej krótką formą:!
)Odpowiedzi:
Jest zaimplementowany teraz (git 1.9 / 2.0, Q1 2014) z wprowadzeniem do pathspec magic
:(exclude)
i jej krótką formą:!
w commit ef79b1f i commit 1649612 przez Nguyễn Thái Ngọc Duy (pclouds
) , dokumentację można znaleźć tutaj .Teraz możesz rejestrować wszystko oprócz zawartości podfolderów:
Możesz też wykluczyć określone elementy w tym podfolderze
konkretny plik:
dowolny plik w
sub
:Możesz sprawić, że wielkość liter w wykluczeniu będzie niewrażliwa!
Jak zauważył Kenny Evitt
Uwaga: Git 2.13 (Q2 2017) doda synonim
^
do!
Zobacz commit 859b7f1 , commit 42ebeb9 (08 lutego 2017) autorstwa Linusa Torvaldsa (
torvalds
) .(Scalone przez Junio C Hamano -
gitster
- w zatwierdzeniu 015fba3 , 27 lutego 2017 r.)Więc dodaj „
^
” jako alternatywny alias dla wykluczającego wpisu pathspec.Zauważ, że przed Git 2.28 (Q3 2020), użycie negatywnej ścieżki ścieżki podczas zbierania ścieżek, w tym nieśledzonych w drzewie roboczym, zostało zerwane.
Zobacz commit f1f061e (05 czerwca 2020) autorstwa Elijah Newren (
newren
) .(Scalone przez Junio C Hamano -
gitster
- w zobowiązaniu 64efa11 , 18 czerwca 2020 r.)źródło
":(exclude)pathPattern1" ":(exclude)pathPattern2"
, ignorując w ten sposób wiele folderów / plików.':!sub'
zamiast tego, aby uniknąćbash: ... event not found
błędów .":\!sub"
nie działa.git help glossary
(którą znalazłem wgit help -g
[który znalazłem sugerowany wgit help
]).tl; dr:
shopt -s extglob && git log !(unwanted/glob|another/unwanted/glob)
Jeśli używasz Bash , powinieneś być w stanie użyć rozszerzonej funkcji globowania, aby uzyskać tylko potrzebne pliki:
Możesz to połączyć z
globstar
działaniem rekurencyjnym.źródło
Możesz tymczasowo zignorować zmiany w pliku za pomocą:
Idąc dalej, wszystkie zmiany w tych plikach będą ignorowane
git status
,git commit -a
itd Kiedy jesteś gotowy do popełnienia tych plików, wystarczy odwrócić go:i zatwierdź jak zwykle.
źródło
git update-index --skip-worktree
nie powodujegit log
filtrowania zatwierdzeń, które zostały już wykonane.