online - Filter git diff por tipo de cambio
git diff online (5)
¿Hay alguna forma de limitar los archivos modificados a git diff
?
Me gustaría ver las diferencias entre dos confirmaciones, pero excluir las rutas que no existen en una u otra (adiciones / eliminaciones). El siguiente trazador de líneas de Perl ilustra la mayor parte de lo que quiero:
git diff master.. | perl -lnwe ''print unless /^(new|deleted) file/../^diff/ and not /^diff/''
Pero eso deja diff --git a/path b/path
lines para los archivos que fueron nuevos o eliminados. Además, sería mucho mejor si no tuviera que analizar (también falla si algún trozo contiene algo que coincida / ^ diff /, por ejemplo).
Otra alternativa que probé fue:
git diff --name-status (args) | perl -lnwe ''print if s/^M/s+//'' | xargs git diff (args) --
Su salida es mejor, pero todavía se siente hackish.
Como nos recordará Git 2.10 (Q3 2016), existe una manera más fácil de "mostrar todo, excepto archivos agregados / eliminados". (en realidad desde Git 1.8.5, julio de 2013)
git diff --diff-filter=ad master..
Ver commit 16726cf (14 Jul 2016) por Junio C Hamano ( gitster
) .
(Fusionada por Junio C Hamano - gitster
- in commit 2f8c654 , 08 de agosto de 2016)
diff
: documentodiff-filter
exclusionEn v1.8.5 días, 7f2ea5f (
diff
: permite que la letra minúscula especifique qué clase de cambio excluir, 2013-07-17) enseñó el--diff-filter
"--diff-filter
" para tomar letras minúsculas como exclusión , pero olvidamos documentarlo .
Entonces la documentación sobre diff-options
ahora (finalmente) incluye:
Estas letras mayúsculas se pueden descartar para excluir.
Ej--diff-filter=ad
excluye rutas añadidas y eliminadas.
Está buscando --diff-filter=M
para mostrar solo los archivos * M * odified entre las dos ramas.
De man git-diff
--diff-filter=[ACDMRTUXB*]
Seleccione solo los archivos que están
A
agregadoC
copiadoD
eliminadoM
modificadoR
RenombradoT
tienen su tipo (modo) cambiadoU
fusionarX
DesconocidoB
ha tenido su pareja rota*
Todo o nadaSe puede usar cualquier combinación de los caracteres de filtro.
Cuando * (Todo o nada) se agrega a la combinación, todas las rutas se seleccionan si hay algún archivo que coincida con otros criterios en la comparación; si no hay un archivo que coincida con otros criterios, no se selecciona nada.
Para ver todos los archivos modificados y nuevos que puedes usar
git diff --name-only --diff-filter=ACMR PREV_VERSION master
PREV_VERSION
es el hash de tu primer commit.
Para obtener una exportación como zip, puede usar este código
git archive --output=export.zip HEAD $(git diff --name-only --diff-filter=ACMR PREV_VERSION HEAD)
Nota: .gitignore
no está en export.zip
Puede usar el indicador --diff-filter para hacer precisamente esto. git diff --diff-filter=CMRTUXB master..
debe mostrar todo excepto archivos agregados / eliminados.
Utilicé Notepad ++ (Windows) y estas expresiones regulares para filtrar los tipos de extensión y ciertas rutas desde un archivo diff.
^Index.*/.(dll|pdb|exe|txt|zip|log|ism|resx|tlog|htm|lib)$[/s/S.]*?^Index
^Index: Shared/.+$[/s/S.]*?^Index
^Index: Next/source/Utility/.+$[/s/S.]*?^Index
El único problema es cuando llega al final. Tienes que ''ctrl + home'' y volver hasta que no encuentre nada.
(Reemplace lo que se encuentra con ''Índice'')