¿Cómo puedo git log
mostrar solo confirmaciones que cambiaron archivos distintos de los que especifiqué?
Con git log
, puedo filtrar las confirmaciones que veo a aquellas que tocan un conjunto determinado de rutas. Lo que quiero es invertir ese filtro para que solo se enumeren las rutas táctiles que no sean las especificadas.
Puedo conseguir lo que quiero con
git log --format="%n/%n%H" --name-only | ~/filter-log.pl | git log --stdin --no-walk
donde filter-log.pl
esta:
#!/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";
}
}
excepto que quiero algo algo más elegante que eso.
Tenga en cuenta que estoy no preguntando cómo hacer git ignorar los archivos. Estos archivos deben ser rastreados y confirmados. Es solo que, la mayoría de las veces, no me interesa verlos.
Pregunta relacionada: Cómo invertir `git log --grep = <pattern>` o Cómo mostrar los registros de git que no coinciden con un patrón Es la misma pregunta excepto para los mensajes de confirmación en lugar de las rutas.
Discusión en el foro sobre este tema desde 2008: Re: Exclusión de archivos de git-diff Esto parecía prometedor, pero el hilo parece haberse secado.
!f() { git log ... | path/to/filter-log.pl "$@" | git log --stdin --no-walk; f
, o incluso incluir esa parte de la canalización en el script también.find
para filtrar los directorios cuyas confirmaciones no quiero ver. Si quisiera ignorar las entradas de registro de las confirmaciones realizadas en el directorio de nivel raízSiteConfig
, diría:git log `find . -type d -mindepth 1 -maxdepth 1 ! -name *SiteConfig`
git log --oneline --format=%s -- . ":!sub"
funcionará (con la magia de pathpec:(exclude)
y su forma corta:!
)Respuestas:
Está implementado ahora (git 1.9 / 2.0, primer trimestre de 2014) con la introducción pathpec magic
:(exclude)
y su forma corta:!
en commit ef79b1f y commit 1649612 , por Nguyễn Thái Ngọc Duy (pclouds
) , la documentación se puede encontrar aquí .Ahora puede registrar todo excepto el contenido de una subcarpeta:
O puede excluir elementos específicos dentro de esa subcarpeta
un archivo específico:
cualquier archivo dado dentro de
sub
:¡Puede hacer que esa exclusión no distinga entre mayúsculas y minúsculas!
Como señaló Kenny Evitt
Nota: Git 2.13 (Q2 2017) agregará un sinónimo
^
a!
Consulte la confirmación 859b7f1 , la confirmación 42ebeb9 (08 de febrero de 2017) por Linus Torvalds (
torvalds
) .(Combinado por Junio C Hamano -
gitster
- en el compromiso 015fba3 , 27 de febrero de 2017)Por lo tanto, agregue '
^
' como un alias alternativo para una entrada de especificación de ruta excluyente.Tenga en cuenta que, antes de Git 2.28 (tercer trimestre de 2020), se interrumpió el uso de la especificación de rutas negativas, mientras se recopilaban rutas que incluían las sin seguimiento en el árbol de trabajo.
Consulte la confirmación f1f061e (5 de junio de 2020) de Elijah Newren (
newren
) .(Combinado por Junio C Hamano -
gitster
- en el compromiso 64efa11 , 18 de junio de 2020)fuente
":(exclude)pathPattern1" ":(exclude)pathPattern2"
, ignorando por lo tanto múltiples carpetas / archivos.':!sub'
para evitarbash: ... event not found
errores .":\!sub"
no funciona.git help glossary
(que encontré enumerada engit help -g
[que encontré sugerida engit help
]).tl; dr:
shopt -s extglob && git log !(unwanted/glob|another/unwanted/glob)
Si está usando Bash , debería poder usar la función de globbing extendida para obtener solo los archivos que necesita:
Puede combinar esto con
globstar
para acciones recursivas.fuente
Puede ignorar temporalmente los cambios en un archivo con:
En el futuro, todos los cambios en esos archivos serán ignorados por
git status
,git commit -a
, etc. Cuando esté listo para cometer esos archivos, simplemente revertirla:y comprometerse con normalidad.
fuente
git update-index --skip-worktree
no hacegit log
que se filtren las confirmaciones que ya se han realizado.