Desea excluir el archivo de "git diff"

229

Estoy tratando de excluir un archivo ( db/irrelevant.php) de un Git diff. He intentado poner un archivo en el dbsubdirectorio llamado .gitattributescon la líneairrelevant.php -diff y también he intentado crear un archivo llamado que .git/info/attributescontiene db/irrelevant.php.

En todos los casos, el db/irrelevant.phparchivo se incluye en el diff como un parche binario Git. Lo que quiero es que los cambios en ese archivo sean ignorados por el comando diff. ¿Qué estoy haciendo mal?

Miguel
fuente

Respuestas:

325

Omg, drivers y awk para excluir un archivo pésimo? Desde git 1.9 algo puedes:

git diff -- . ':(exclude)db/irrelevant.php' ':(exclude)db/irrelevant2.php'

Ah, elegancia! Vea la respuesta citada y para más detalles esta respuesta de @torek

Mr_and_Mrs_D
fuente
44
NOTA: Si desea excluir un nombre de archivo específico, debe prefijarlo con un asterisco, diferente de la .gitignoresintaxis del archivo. Por ejemplo, en :!*shrinkwrap.yamllugar de :!shrinkwrap.yaml.
vaughan
77
Excluir más archivos, por ejemplo, tengo archivos * .min.css y * .min.js para evitar desde el git diff. Entonces, uso el comandogit diff -- . ':(exclude)*.min.js' ':(exclude)*.min.css'
maheshwaghmare
44
sintaxis de Windows : git diff -- . ":(exclude)db/irrelevant.php"(comillas dobles en lugar de comillas simples)
cnlevy
44
¡Gracias! Tal sintaxis esotérica ... Tengo que buscarla cada vez.
Daniel Waltrip
1
@cnlevy o sin comillas! git diff -- . :(exclude)db/irrelevant.php
Matthias
62

Puede configurar un controlador diff personalizado con un comando no op y asignarlo a aquellos archivos que deben ignorarse.

Cree un controlador diff específico de repositorio con este comando

git config diff.nodiff.command /bin/true

o para todos tus repositorios con --global .

(Si /bin/trueno existe en MacOS, las alternativas estarían usando /usr/bin/trueo echo).

Luego, asigne el nuevo controlador diff a los archivos que desea ignorar en su .git/info/attributesarchivo.

irrelevant.php    diff=nodiff

Si se supone que este estado se comparte con otros desarrolladores, puede usarlo en .gitattributeslugar de .git/info/attributescompartir el git configcomando con sus pares (a través de un archivo de documentación o algo así).

KurzedMetal
fuente
2
Esto es exactamente lo que estaba buscando, como se describe en kerneltrap.org/mailarchive/git/2008/10/17/3711254 Edité ~ / .gitconfig agregando: [diff "nodiff"] `command = / bin / true` y luego creé un archivo llamado .git / info / atributos a los que agregué: irrelevant.php diff=nodiff
Michael
12
Esta respuesta funcionó mucho mejor para mí: stackoverflow.com/questions/1016798/…
Neil Forrester
3
Curiosamente, este enfoque no funciona git diff --stat. En ese caso, se podría usar git diff ... | diffstatcomo solución alternativa.
ddkilzer
@Michael ese enlace parece estar descifrado, ¿hay otro?
DickieBoy
3
solo una adición: si desea forzar a git diff a mostrarlo de todos modos, use--no-ext-diff
Florian Klein
35

También puede usar el programa filterdiff de la colección de programas patchutils para excluir algunas partes de un diff. Por ejemplo:

git diff | filterdiff -p 1 -x db/irrelevant.php
Szilárd Pfeiffer
fuente
44
Tenga en cuenta que -p, desde la página de manual (1), es "-pn, --strip-match = n Al hacer coincidir, ignore los primeros n componentes del nombre de ruta". Me tomó un tiempo detectar que -p 1estaba quitando la dbparte del camino del OP. Si solo desea especificar un nombre de archivo e ignorar todas las posibilidades de ruta / directorio, puede usar -p 99.
Tyler Collier
32

Este método es más corto que las respuestas aceptadas.

git diff 987200fbfb 878cee40ba --stat -- ':!*.cs'

Para obtener más información sobre las diferentes posibilidades de inclusión / exclusión, lea esta otra publicación

Chiel ten Brinke
fuente
Tenga en cuenta que el filtro solo se aplica a todos los archivos debajo de su directorio actual.
Chiel ten Brinke
Esta fue la mejor respuesta. Pude simplificarlo un poco más: stackoverflow.com/a/58845608/3886183
dlsso
2
Quitaría la parte --stat, o al menos explicaría lo que hace, ya que ninguna de las otras respuestas la incluye.
mix3d
El indicador de estadísticas le muestra los archivos y sus totales de diferencias, lo que le permite verificar fácilmente si el filtro funcionó de la manera deseada.
Chiel ten Brinke
17

Esta solución de una línea no requiere otras utilidades / descargas:

git diff `git status -s |grep -v ^\ D |grep -v file/to/exclude.txt |cut -b4-`

¿Dónde file/to/exclude.txtestá el nombre del archivo que desea excluir, por supuesto?

Editar: crédito ksenzee para corregir archivos eliminados que rompen la diferencia.

Ben Roux
fuente
Estoy tratando de adaptar su revestimiento git diff --stat mastersin mucho éxito, ¿podría ayudarme?
Mr_and_Mrs_D
13

Muy buena respuesta de KurzedMetal para lo que necesitaba hacer, que era la capacidad de ver que el archivo había cambiado, pero no generar la diferencia, que podría haber sido enorme, en mi caso.

Pero un colega mío sugirió un enfoque que era aún más simple y funcionó para mí:

agregar el .gitattributesarchivo en el directorio donde reside el archivo que se ignorará git diffcon el siguiente contenido:

file-not-to-diff.bin -diff

Eso todavía permite git status"ver" si el archivo cambió. git difftambién "verá" que el archivo ha cambiado, pero no generará el diff.

Esa .binextensión para el archivo en el ejemplo fue deliberada. Me doy cuenta de que este es el comportamiento predeterminado de git para archivos binarios, y no requiere un manejo especial con .gitattributes. Pero en mi caso, estos archivos fueron reconocidos como archivos de texto por git y la utilidad "archivo" y esto hizo el truco.

usuario3589608
fuente
11

Respuesta más simple

git diff ':!db/irrelevant.php'

Es justo ':!<path to file>'después de su comando diff. El comando diff puede ser tan complicado como desee, y puede usar comodines como *.min.jso agregar múltiples exclusiones (separe los bloques entre comillas) si lo desea.

dlsso
fuente
5

Relativo al directorio raíz de git

git diff acepta una exclusión opcional

git diff -- ":(exclude)thingToExclude"

Es posible que desee agregar algunos comodines

git diff -- ":(exclude)*/thingToExclude/*"

Dirigirse a tipos de archivos específicos

git diff -- ":(exclude)*/$1/*.png"

O suelte un pequeño script para sus archivos de puntos

Tales como .bash_profileo.zshrc

gde() {
    # git diff exclude files or folders 
    # usage: 
    # gde fileOrFolderNameToExclude
    git diff -- ":(exclude)*/$1/*"
}
jasonleonhard
fuente
esto simplemente no funciona para mí, no obtengo ninguna diferencia, con ambas sintaxis, usando (excluir) o! Tengo git 2.21.0
Olivvv
Puede git diff archivos no escalonados o escalonados. Si los ha agregado git, se convierten en escenarios. Si están organizados, puedes hacerlo git diff --stagedEspero que esto te ayude.
jasonleonhard
Sintácticamente, ¿qué está haciendo el colon?
Jonás
2

Es muy simple, puede excluir lo que quiera con los comandos estándar de Unix, esos comandos están disponibles en git bash incluso en el entorno de Windows. El siguiente ejemplo muestra cómo excluir diff para archivos pom.xml, primero verifique diff to master solo para los nombres de archivo, luego use 'grep -v' excluir archivos que no desea y luego vuelva a ejecutar diff to master con la lista preparada:

git diff master `git diff --name-only master | grep -v pom.xml`
Nieznany Anonimiec
fuente
1

similar a la solución de Ben Roux , pero compartiendo de todos modos:

git status --porcelain | grep -v $PATTERN_TO_EXCLUDE | awk '{print $2}' | xargs git diff

o, si los cambios ya se han comprometido localmente:

git diff --name-only origin/master | grep -v $PATTERN_TO_EXCLUDE | xargs git diff origin/master

Ejemplos:

git status --porcelain | grep -v docs | awk '{print $2}' | xargs git diff origin/master

git diff --name-only origin/master | grep -v docs | xargs git diff origin/master
Chris Montoro
fuente
1

Hago lo siguiente:

git add *pattern_to_exclude*
git diff
git reset HEAD .

Sé que no es una solución elegante y, a veces, no se puede usar (por ejemplo, si ya tiene cosas preparadas), pero funciona sin tener que escribir un comando complicado

BlueMagma
fuente
0

Si desea hacer esto solo para inspeccionar visualmente la diferencia, una herramienta de diferencia visual (como Meld ) le permitirá hacerlo con un comando breve que es fácil de recordar.

Primero, configure una herramienta de diferencias si aún no lo ha hecho.

$ git config --global diff.tool = meld

Luego, puede ejecutar un directorio diff.

$ git difftool --dir-diff

Podrá navegar por diferencias (por archivo) en Meld (o su herramienta de elección). Simplemente no abra el archivo que desea ignorar.

mkasberg
fuente