Como posso git log
mostrar apenas commits que alteraram arquivos diferentes dos que eu especificar?
Com git log
, posso filtrar os commits que vejo para aqueles que tocam um determinado conjunto de caminhos. O que eu quero é inverter esse filtro para que apenas os commits que tocam caminhos diferentes dos especificados sejam listados.
Eu posso conseguir o que quero com
git log --format="%n/%n%H" --name-only | ~/filter-log.pl | git log --stdin --no-walk
onde 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";
}
}
exceto que eu quero algo um pouco mais elegante do que isso.
Note que estou não perguntando como fazer git ignorar os arquivos. Esses arquivos devem ser rastreados e confirmados. É que, na maioria das vezes, não estou interessado em vê-los.
Questão relacionada: Como inverter `git log --grep = <pattern>` ou como mostrar logs do git que não correspondem a um padrão É a mesma questão, exceto para mensagens de confirmação ao invés de caminhos.
Discussão do fórum sobre este assunto de 2008: Re: Excluindo arquivos do git-diff Isso parecia promissor, mas o tópico parece ter secado.
!f() { git log ... | path/to/filter-log.pl "$@" | git log --stdin --no-walk; f
ou até mesmo envolver essa parte do pipeline no script.find
para filtrar diretórios cujos commits não quero ver. Se eu quisesse ignorar as entradas de log dos commits feitos no diretório de nível raizSiteConfig
, eu diria:git log `find . -type d -mindepth 1 -maxdepth 1 ! -name *SiteConfig`
git log --oneline --format=%s -- . ":!sub"
funcionará (com a magia:(exclude)
:!
do pathspec e sua forma abreviada )Respostas:
Ele está implementado agora (git 1.9 / 2.0, Q1 2014) com a introdução pathspec magic
:(exclude)
e sua forma abreviada:!
em commit ef79b1f e commit 1649612 , de Nguyễn Thái Ngọc Duy (pclouds
) , a documentação pode ser encontrada aqui .Agora você pode registrar tudo, exceto o conteúdo de uma subpasta:
Ou você pode excluir elementos específicos dessa subpasta
um arquivo específico:
qualquer arquivo dentro de
sub
:Você pode tornar essa exclusão insensível a maiúsculas e minúsculas!
Como Kenny Evitt observou
Nota: Git 2.13 (Q2 2017) adicionará um sinônimo
^
para!
Consulte commit 859b7f1 , commit 42ebeb9 (08 de fevereiro de 2017) de Linus Torvalds (
torvalds
) .(Fundido por Junio C Hamano -
gitster
- no commit 015fba3 , 27 de fevereiro de 2017)Portanto, adicione '
^
' como um alias alternativo para uma entrada de exclusão de pathspec.Observe que, antes do Git 2.28 (Q3 2020), o uso de pathspec negativo, enquanto os caminhos de coleta, incluindo os não rastreados na árvore de trabalho, foi interrompido.
Consulte commit f1f061e (05 de junho de 2020) de Elijah Newren (
newren
) .(Fundido por Junio C Hamano -
gitster
- no commit 64efa11 , 18 de junho de 2020)fonte
":(exclude)pathPattern1" ":(exclude)pathPattern2"
, ignorando várias pastas / arquivos.':!sub'
para evitarbash: ... event not found
erros .":\!sub"
não funciona.git help glossary
(que encontrei listada emgit help -g
[que encontrei sugerida emgit help
]).tl; dr:
shopt -s extglob && git log !(unwanted/glob|another/unwanted/glob)
Se você estiver usando o Bash, deverá conseguir usar o recurso de globbing estendido para obter apenas os arquivos de que precisa:
Você pode combinar isso
globstar
para uma ação recursiva.fonte
Você pode ignorar temporariamente as alterações em um arquivo com:
Daqui para frente, todas as alterações a esses arquivos serão ignorados por
git status
,git commit -a
etc. Quando estiver pronto para cometer esses arquivos, basta invertê-la:e comprometa-se normalmente.
fonte
git update-index --skip-worktree
não causagit log
a filtragem de commits que já foram feitos.