2009-06-19 19 views
57

Estoy siguiendo un proyecto con git. Hay algunos archivos de proyecto de Xcode en la copia de trabajo que deseo seguir, pero no quiero ver en diffs, porque siempre hay docenas de líneas cambiadas en las que nunca estoy interesado. ¿Hay una manera simple de tener git-diff skip estos archivos? He tratado de establecer una costumbre función “silencio” diff:Excluir archivos de git-diff

 
$ cat .gitattributes 
Project.xcodeproj/* diff=nodiff 

$ cat ~/.gitconfig 
[diff "nodiff"] 
    command = /bin/true 

Pero:

 
$ git diff 
external diff died, stopping at Project.xcodeproj/zoul.mode1v3. 

¿Qué estoy haciendo mal?

Respuesta

80

El problema es que /bin/true volverá inmediatamente sin leer su entrada. git diff por lo tanto piensa, bastante razonablemente, que ha muerto prematuramente.

Lo que realmente quiere hacer es desarmar el atributo diff, no establecerlo en un comando falso. Pruebe esto en su .gitattributes:

Project.xcodeproj/* -diff 
+0

Sí, esto funciona bien, muchas gracias. – zoul

+5

Excluir el directorio completo no funcionó para mí, porque muchos de los archivos están en subdirectorios más profundos. En cambio, * .xcuserstate -diff fue útil para ignorar el archivo que a menudo cambia. – Bemmu

+0

@Bemmu: Para ser justos, solo estaba usando el mismo patrón que en la pregunta. No hubo ninguna sugerencia de que el patrón no funcionaba en la situación original de los solicitantes. –

6

Es posible utilizar un alias en su .git/config

[alias] 
     mydiff = !git diff | filterdiff -x "*/Project.xcodeproj/*" 

Es necesario filterdiff (de patchutils) para este truco.

sudo apt-get install patchutils 

Aún así el diff no es perfecto, deja un poco de basura:

[email protected]:~/git-filter-test$ git mydiff 
diff --git a/Project.xcodeproj/dummy.txt b/Project.xcodeproj/dummy.txt 
index 3e1f9e6..89dfed9 100644 
diff --git a/dummy2.txt b/dummy2.txt 
index 91966ce..d9588a9 100644 
--- a/titi.txt 
+++ b/titi.txt 
@@ -1,3 +1,3 @@ 
aaaaaaaaaa 
-bbbbbbbbb 
cccccc 
+ddd 
+0

Esto es muy agradable, gracias. La basura está bien, al menos sé que esos archivos han cambiado. Pero pierdo el color, ¿hay alguna forma de recuperarlo? Probé git diff --color para forzarlo, pero luego filterdiff se confunde con los escapes de color y deja de filtrarse. – zoul

+0

Oh sí, | colordiff | menos -r. – zoul

+0

Gracias por las respuestas a esta pregunta - filterdiff casi satisface mis necesidades. Sin embargo, la "basura" restante me está causando problemas. ¿Hay alguna manera de decir "eliminar por completo toda referencia a un archivo" usando filterdiff? – Michael

0

Sólo en caso que alguien más tiene el mismo dolor que teníamos. Queríamos excluir un archivo que ya se había confirmado.

Este puesto era la manera más útil: working with .git/info/exclude too late

Específicamente lo que hay que hacer caso omiso de un archivo se utilice realmente el comando git eliminar Ver git rm (http://www.kernel.org/pub/software/scm/git/docs/git-rm.html)

lo prueba por ir

git rm --dry-run *.log
(si usted dice querido excluir todo los archivos de registro)

esto dará como resultado que sería excluido si lo ejecutó.

continuación

se ejecuta por ir

git rm *.log
(o lo que sea rutanombreArchivo/expresión que se desea)

7

Otra solución que produce una salida limpia sin necesidad de herramientas externas (añadir a .git/config):

[alias] 
    mydiff = !git diff -- $(git diff --name-only | grep -Ev "Project.xcodeproj/") 

luego ejecutarlo con:

git mydiff 

Tenga en cuenta que es mejor que git diff --name-onlygit ls-files porque va a pasar una lista más corta de archivos a git diff, ya que sólo se incluirán los archivos que se han modificado. Me he encontrado con problemas al exceder la cantidad máxima de argumentos en proyectos grandes al usar git ls-files.

+0

Encontré problemas con rutas complejas con esto. Sospecho que sería mejor si usara el modificador -z: "no mande las rutas y use NULs como terminadores de campo de salida". –

Cuestiones relacionadas