Как я могу сделать так, чтобы git log
показывались только те коммиты, которые изменили файлы, кроме тех, которые я указал?
С помощью git log
я могу отфильтровать наблюдаемые мной коммиты до тех, которые касаются заданного набора путей. Я хочу инвертировать этот фильтр, чтобы в списке отображались только те пути касания, которые не указаны.
Я могу получить то, что хочу, с
git log --format="%n/%n%H" --name-only | ~/filter-log.pl | git log --stdin --no-walk
где filter-log.pl
находится:
#!/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";
}
}
за исключением того, что я хочу что-то более элегантное, чем это.
Обратите внимание, что я не спрашиваю, как заставить git игнорировать файлы. Эти файлы следует отслеживать и фиксировать. Просто в большинстве случаев мне не интересно их видеть.
Связанный вопрос: Как инвертировать `git log --grep = <pattern>` или Как показать журналы git, не соответствующие шаблону. Это тот же вопрос, за исключением сообщений о фиксации, а не путей.
Обсуждение этой темы на форуме в 2008 году: Re: Исключение файлов из git-diff Это выглядело многообещающе, но, похоже, тема иссякла.
!f() { git log ... | path/to/filter-log.pl "$@" | git log --stdin --no-walk; f
, или даже обернуть эту часть конвейера в скрипт.find
для фильтрации каталогов, чьи коммиты я не хочу видеть. Если бы я хотел игнорировать записи журнала из коммитов, сделанных в каталог корневого уровня,SiteConfig
я бы сказал:git log `find . -type d -mindepth 1 -maxdepth 1 ! -name *SiteConfig`
git log --oneline --format=%s -- . ":!sub"
будет работать (с магией pathspec:(exclude)
и ее краткой формой:!
)Ответы:
Он реализован сейчас (git 1.9 / 2.0, Q1 2014) с вводной магией pathspec
:(exclude)
и его краткой формой:!
в commit ef79b1f и commit 1649612 , автор Nguyễn Thái Ngọc Duy (pclouds
) , документацию можно найти здесь .Теперь вы можете регистрировать все, кроме содержимого подпапки:
Или вы можете исключить определенные элементы в этой подпапке
конкретный файл:
любой данный файл в
sub
:Вы можете сделать это исключение нечувствительным к регистру!
Как отметил Кенни Эвитт
Примечание. Git 2.13 (второй квартал 2017 г.) добавит синоним
^
к!
См. Commit 859b7f1 , commit 42ebeb9 (8 февраля 2017 г.) Линус Торвальдс (
torvalds
) .(Объединено Junio C Hamano -
gitster
- в коммите 015fba3 , 27 февраля 2017 г.)Поэтому добавьте '
^
' в качестве альтернативного псевдонима для исключающей записи pathspec.Обратите внимание, что до Git 2.28 (3 квартал 2020 г.) использование отрицательных pathspec при сборе путей, в том числе неотслеживаемых, в рабочем дереве было нарушено.
См. Commit f1f061e (5 июня 2020 г.) Элайджа Ньюрен (
newren
) .(Объединено Junio C Hamano -
gitster
- в коммите 64efa11 , 18 июня 2020 г.)источник
":(exclude)pathPattern1" ":(exclude)pathPattern2"
, игнорируя несколько папок / файлов.':!sub'
вместо этого, чтобы избежатьbash: ... event not found
ошибок .":\!sub"
не работает.git help glossary
(Я нашел ее вgit help -g
[которую я нашел предложенной вgit help
]).ТЛ; др:
shopt -s extglob && git log !(unwanted/glob|another/unwanted/glob)
Если вы используете Bash, вы сможете использовать расширенную функцию подстановки, чтобы получить только те файлы, которые вам нужны:
Вы можете комбинировать это с
globstar
для рекурсивного действия.источник
Вы можете временно игнорировать изменения в файле с помощью:
В дальнейшем, все изменения в эти файлы будут игнорироваться
git status
,git commit -a
и т.д. Когда вы будете готовы совершить эти файлы, просто отменить его:и зафиксируйте как обычно.
источник
git update-index --skip-worktree
не вызываетgit log
фильтрацию уже сделанных коммитов.