Haciendo que git diff --stat muestre la ruta completa del archivo

104

Al hacerlo, git diff --statalgunos archivos se enumeran con la ruta completa desde la base del repositorio, pero algunos archivos se enumeran como:

.../short/path/to/filename.  

Ese es el camino que comienza con ...y solo se muestra el camino corto.

Me gustaría git diffenumerar la ruta completa del archivo para todos los archivos para que un script pueda procesarlo fácilmente. ¿Hay alguna manera de que pueda git diffmostrar siempre el camino completo?

Badri
fuente

Respuestas:

108

El git diffcomando toma valores opcionales para --stat:

--stat[=<width>[,<name-width>[,<count>]]]
       Generate a diffstat. You can override the default output width for
       80-column terminal by --stat=<width>. The width of the filename
       part can be controlled by giving another width to it separated by a
       comma. By giving a third parameter <count>, you can limit the
       output to the first <count> lines, followed by ...  if there are
       more.

       These parameters can also be set individually with
       --stat-width=<width>, --stat-name-width=<name-width> and
       --stat-count=<count>.

(Para las secuencias de comandos, es posible que desee utilizarlo git diff-treedirectamente, ya que es más un comando de "plomería", aunque sospecho que estará bien de cualquier manera. Tenga en cuenta que necesita el mismo texto adicional --statcuando lo usa git diff-tree. La diferencia esencial entre usar la git diff"porcelana "front end, y el git diff-treecomando de fontanería, es el que git diffbusca las opciones configuradas para diff.renamesdecidir si se debe realizar la detección de cambio de nombre. Bueno, eso, además de que el front end git diffhará el equivalente git diff-indexa comparar una confirmación con el índice , por ejemplo. En otras palabras, git diff lee su configuración e invoca la tubería correcta automáticamente ).

torek
fuente
6
git diff --numstat es lo mismo que diff-tree
cmcginty
1
Tenga en cuenta que para limitar el ancho de la última parte (+++ / ---) puede usar un --stat-graph-width=...modificador separado . Tenga en cuenta también que la configuración alta --stat-graph-width=y --stat-name-width=no es suficiente, también debe configurar lo --stat-width=suficientemente grande para cubrir los dos.
jakub.g
@ jakub.g: buen punto. Basado en un poco de investigación en la fuente de git, esto entró con git 1.7.10.
torek
4
¿Hay alguna forma de globalizar esto? Escribirlo todo el tiempo es una locura.
Rudie
@Rudie: ay, no: hay una variable de configuración diff.statGraphWidthque puede usar para establecer el --stat-graph-widthvalor, pero las otras predeterminadamente tienen el ancho de su terminal. (Entonces, respuesta alternativa: "sí, solo haz que tu ventana de terminal tenga 1000 columnas de ancho" :-))
torek
22

Para el procesamiento de scripts, sería mejor utilizar uno de los siguientes:

# list just the file names
git diff --name-only
path/to/modified/file
path/to/renamed/file


# list the names and change statuses:
git diff --name-status
M       path/to/modified/file
R100    path/to/existing/file   path/to/renamed/file


# list a diffstat-like output (+ed lines, -ed lines, file name):
git diff --numstat
1       0       path/to/modified/file
0       0       path/to/{existing => renamed}/file

Cada uno de estos se vuelve más útil para un procesamiento de scripts robusto cuando se combina con la -zopción, que se utiliza NULcomo terminadores de campo.

cmbuckley
fuente
Según mis pruebas, no recibe la ruta completa del recurso usando estos comandos. Por ahora solo veo rutas relativas para archivos eliminados. No sé si este es solo el caso de estos archivos.
GCallie
1
Todas las salidas devolverán rutas relativas a git rev-parse --show-toplevel. El problema original se refería a rutas truncadas, lo cual es un problema en diffstats, particularmente para nombres de archivo largos o un valor bajo para --stat-name-width. Los comandos anteriores no truncarán las rutas, pero mostrarán la ruta "completa" según lo solicitado, aunque aún en relación con la raíz del repositorio.
cmbuckley
18

Para los usuarios de Bash, puede usar la $COLUMNSvariable para llenar automáticamente el ancho de terminal disponible:

git diff --stat=$COLUMNS

Es posible que los nombres de ruta muy largos todavía estén truncados; en este caso, puede reducir el ancho de la parte +++ / --- usando --stat-graph-width, por ejemplo, esto lo limita a 1/5 del ancho del terminal:

git show --stat=$COLUMNS --stat-graph-width=$(($COLUMNS/5))

Para una solución más genérica, puede usar la salida de tput colspara determinar el ancho del terminal.

John Mellor
fuente
2
¿Hay alguna forma de globalizarnos --stat=$COLUMNS,$COLUMNS? Escribirlo todo el tiempo es una locura.
Rudie
@Rudie agrega export COLUMNSa tu ~/.bashrc, y en tu ~/.gitconfigdebajo [alias], agregasmart-diff = ! "gitsmartdiff() { git diff $2 --stat=$COLUMNS,$COLUMNS; }; gitsmartdiff"
user151841
@ user151841 Eso solo cambia diff. Quiero que también funcione para fusiones y extracciones, etc. (Ni siquiera puedo hacerlo manualmente). No creo que GIT lo admita.
Rudie
@Rudie Bueno, una vez que se completa la extracción o combinación, puede diferenciar entre los hash anteriores y los nuevos.
user151841
2
@ user151841 Seguro, pero la fusión ya proporciona un resumen de estadísticas. Sin parámetros / config. Sería genial si todos los 'resúmenes de estadísticas' usaran la misma configuración.
Rudie
4

Hay una opción --name-only: git diff --name-only. La opción también es compatible con otros comandos de git como showy stash.

Las rutas no se acortan con la opción.

Yevhen Pavliuk
fuente
0

Creé el siguiente alias de git:

diffstat = ! "gitdiffstat() {  git diff --stat=$(tput cols) ${1:-master} ; }; gitdiffstat"

Lee el recuento de columnas del tput colscomando. De forma predeterminada, difiere contra master, pero opcionalmente puede especificar otra rama.

$ git diffstat
 .gitalias | 2 +-
 1 file changed, 1 insertion(+), 1 deletion(-)
usuario151841
fuente
0

Una solución simple que encontré fue hacer esto: (solo funciona en * nix, lo siento, no osx)

git diff --stat=$COLUMNS --relative | head -n -1 | cut -c 2- | xargs -d '\n' -P4 printf "$(pwd)/%s\n"

Esta versión funciona para ambos, pero no se ve muy bien en osx.

git diff --stat=$COLUMNS --relative | sed -e '$ d' | cut -c 2- | xargs -n4 -I{} echo "$(pwd)/{}"
Javier Buzzi
fuente
-1

Descubrí que el comportamiento de diff --stat cambió en algún lugar alrededor de git 1.7.10, donde anteriormente acortaba las rutas de los archivos a un ancho fijo de forma predeterminada; ahora muestra todo lo que permite la ventana de su terminal. Si tiene este problema, asegúrese de actualizar a 1.8.0 o más reciente.

Alex Spurling
fuente