2012-05-02 15 views
100

Estoy tratando de excluir un archivo (db/irrelevant.php) de un Git diff. He intentado poner un archivo en el subdirectorio db llamado .gitattributes con la línea irrelevant.php -diff y también he intentado crear un archivo llamado .git/info/attributes que contiene db/irrelevant.php.Quiere excluir el archivo de "git diff"

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

Respuesta

93

Omg, conductores y awk para excluir un archivo pésimo? Desde git 1.9 something puede:

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

Ah, elegance!Consulte la respuesta entre comillas y para obtener más información this answer por @torek

+5

¿Qué sucede si necesito excluir varios archivos? – itsashis4u

+4

@ itsashis4u 'git diff -. ': (excluir) db/irrelevant.php' ': (excluir) db/another_irrelevant.php'' – tokland

+0

NOTA: si desea excluir un nombre de archivo específico, debe marcar con un asterisco el prefijo, diferente del archivo '.gitignore' sintaxis. P.ej. ':! * shrinkwrap.yaml' en lugar de':! shrinkwrap.yaml'. – vaughan

30

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 
+3

Tenga en cuenta que '-p', desde la página de manual (1), es" -p n, --strip-match = n Cuando coincide, ignore los primeros n componentes de la ruta de acceso ". Me tomó un tiempo detectar que '-p 1' estaba eliminando la parte' db' del camino del OP. Si solo desea especificar un nombre de archivo e ignorar todas las posibilidades de ruta/directorio, puede usar '-p 99'. –

51

Se puede configurar un controlador diff personalizada con un comando no op y asignarlo a los archivos que deben ser ignorados.

crear un controlador específico diff repositorio con este comando

git config diff.nodiff.command /bin/true 

o para todos sus pases con --global.

(Si /bin/true no existe en MacOS, las alternativas estarían utilizando /usr/bin/true o echo).

A continuación, asigne el nuevo controlador de diferencias a los archivos que desea ignorar en su archivo .git/info/attributes.

irrelevant.php diff=nodiff 

Si este estado se supone que debe ser compartido con otros desarrolladores que podría utilizar en lugar de .gitattributes.git/info/attributes y compartir el comando git config con sus pares (a través de un archivo de documentación o algo así).

+2

Esto es exactamente lo que estaba buscando - como se describe en http://kerneltrap.org/mailarchive/git/2008/10/17/3711254 edité ~/.gitconfig añadiendo: '[diff "nodiff"] '' comando =/bin/true' y luego he creado un archivo llamado .git/información/atributos en la que añadí: 'irrelevant.php diff = nodiff' – Michael

+8

Esta respuesta trabajado mucho mejor para mí: http://stackoverflow.com/questions/1016798/excluding-files-from-git-diff –

+3

Curiosamente, este enfoque no funciona con 'git diff --stat'. En ese caso, uno podría usar 'git diff ... | diffstat' como una solución. – ddkilzer

17

Esta solución de una línea requiere ningún otro utils/descargas:

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

Dónde file/to/exclude.txt es el nombre del archivo que desea excluir, desde luego.

Editar: crédito ksenzee para arreglar archivos borrados rompiendo el diff.

+0

Estoy intentando adaptar tu trazador de líneas a 'git diff --stat master' sin mucho éxito. ¿Podrías ayudarme? –

0

similar a Ben Roux's solución, pero compartiendo todos modos:

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

o, si los cambios ya han de ser cometido a nivel local:

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 
2

Este método es más corto que el del inversor aceptado.

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

Para obtener más información acerca de las diferentes posibilidades de inclusión/exclusión leer this other post

0

Si usted quiere hacer esto sólo para inspeccionar visualmente el diff, una herramienta visual de diferencias (como Meld) le permitirá hacerlo con un comando corto que es fácil de recordar.

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

$ git config --global diff.tool = meld 

A continuación, puede ejecutar un directorio diff.

$ git difftool --dir-diff 

Podrá buscar diffs (por archivo) en Meld (o la herramienta que elija). Simplemente no abra el archivo que desea ignorar.