2010-12-07 22 views
112

Me pregunto cómo puedo excluir un directorio completo de mi Git diff. (En este caso/especificación). Estoy creando un diff para todo nuestro lanzamiento de software usando el comando git diff. Sin embargo, los cambios en las especificaciones son irrelevantes para este procedimiento y solo generan dolores de cabeza. Ahora sé que puedo hacerExcluir un directorio de git diff

git diff previous_release..current_release app/ 

Esto crearía un diff para todos los cambios en el directorio de aplicación, pero no, por ejemplo, en el directorio lib /. ¿Alguien sabe cómo lograr esta tarea? ¡Gracias!

Editar: Solo quiero que quede claro, sé que puedo ensartar los parámetros de todos mis directorios al final, menos/espec. Esperaba que hubiera una manera de excluir verdaderamente un solo directorio en el comando.

+4

Encontré esta pregunta increíble porque tenía como objetivo ignorar _submodules_. En este caso, si eres tan ingenuo como yo, [esta pregunta] (http://stackoverflow.com/questions/3240881/) puede ser más útil. – brandizzi

+0

Es extraño que todavía no tengamos un modificador nativo de Git para hacer esto en septiembre de 2016 –

Respuesta

103

Suponiendo que utiliza bash, y que ha permitido extglob, se podía manejar que desde el lado de la carcasa:

git diff previous_release current_release !(spec) 

ahorra tener que agregar el resto de las cosas.

O, cáscara agnóstica:

git diff previous_release current_release --name-only | grep -v '^spec/' \ 
    | xargs git diff previous_release current_release -- 

Se podría concluir que en un script de shell de una sola línea para ahorrarse tener que volver a escribir los argumentos.

+1

P.S. globbing no coincide con los archivos ocultos, por lo que si eres obsesivo, quizás quieras agregar ''. (. |) 'para unir todo comenzando con' .' además de '.' y' ..'. – Cascabel

+0

Esto no parece funcionar para archivos que son nuevos o eliminados en las sucursales. Recibo errores que detienen la ejecución del script, diciendo que no puede diferir en contra de él. –

+2

@ Graham: Creo que el '- 'que acabo de añadir debería solucionarlo. – Cascabel

-5
git diff app lib 
20

Puede intentar y desarmar el atributo diff para cualquier archivo dentro del directorio lib.
.gitattributes:

lib/* -diff 
+0

, esto eliminaría las especificaciones de todos mis diffs. Todavía quiero ver mis diferencias en la carpeta de especificaciones normalmente, pero no cuando estoy ejecutando esta 'versión' diff – Mysrt

+2

@Mystr: Se puede configurar eso '.el archivo gitattributes' en una rama especial creada solo para este tipo de diff de 'release';) Rebase esa rama especial en la parte superior de 'current_release' y haga su diff desde allí. – VonC

+0

Ah bien, gracias, dos buenas soluciones a esta pregunta – Mysrt

199

Basado en this answer también puede utilizar:

git diff previous_release..current_release -- . ':!spec' 

Esta es una característica git nueva norma que permite excluir ciertos caminos. Debería ser más confiable que varios oneliners de shell.

Estoy publicando aquí porque esta pregunta sigue siendo el hit # 1 para "git diff exclude path".

+2

Me encanta esta respuesta. Si agrega opciones, hágalo antes del doble guión. Por ejemplo: 'git diff previous_release current_release --name-status -. ':! spec'' – liamvictor

+0

No me di cuenta de que podía usar los nombres de las ramas para 'current_release' y' previous_release' - me hizo sonreír cuando lo descubrí. – trueheart78

+1

Lo que funcionó para mí 'git diff --stat dev -. ':!/Mopy/Docs/*' '. Lo que no funcionó para mí 'git diff dev --stat--. ':! (' Mopy/Docs/Wrye Bash General Readme.html '|' Mopy/Docs/Wrye Bash Advanced Readme.html ')' 'y variaciones –

15

Si desea especificar más de una ruta para excluir en un git diff, simplemente agregue parámetros de exclusión adicionales al final, p. para excluir todo en proveedor y bin directorios de las estadísticas: -

git diff --stat previous_release..current_release -- . ':!vendor' ':!bin' 
1

Git diff ahora acepta un formato de exclusión personalizado: git diff -- ':(exclude)lib/*'

Tenga cuidado si usted tiene una gran cantidad de nombres de carpetas repetitivos ('/ app', '/ lib', etc.), ya que esto excluirá los archivos relativos al directorio de trabajo actual Y al directorio raíz de git.

+0

te falta un punto, no debería ser 'git diff--. ': (excluir) lib/*' '? –