¿Puedo usar git diff en archivos sin seguimiento?

Resuelto Andrew Grimm asked hace 15 años • 13 respuestas

¿Es posible solicitar git diffque se incluyan archivos sin seguimiento en su salida de diferencias, o lo mejor que puedo hacer es usarlos git adden los archivos recién creados y en los archivos existentes que he editado, luego usar:

git diff --cached
Andrew Grimm avatar May 13 '09 09:05 Andrew Grimm
Aceptado

Con las versiones recientes de git, puede crear git add -Nel archivo (o --intent-to-add), que agrega un blob de longitud cero al índice en esa ubicación. El resultado es que su archivo "sin seguimiento" ahora se convierte en una modificación para agregar todo el contenido a este archivo de longitud cero, y eso aparece en la salida "git diff".

git diff

echo "this is a new file" > new.txt
git diff

git add -N new.txt
git diff
diff --git a/new.txt b/new.txt
index e69de29..3b2aed8 100644
--- a/new.txt
+++ b/new.txt
@@ -0,0 +1 @@
+this is a new file

Lamentablemente, como se señaló, no puede hacerlo git stashmientras tenga un --intent-to-addarchivo pendiente como este. Aunque si necesita guardarlos, simplemente agregue los archivos nuevos y luego guárdelos. O puede utilizar la solución alternativa de emulación:

git update-index --add --cacheinfo \
100644 e69de29bb2d1d6434b8b29ae775ad8c2e48c5391 new.txt

(Configurar un alias es tu amigo aquí).

araqnid avatar May 13 '2009 12:05 araqnid

Creo que puede diferenciar los archivos en su índice y los archivos sin seguimiento simplemente proporcionando la ruta a ambos archivos.

git diff --no-index tracked_file untracked_file
Harold avatar May 13 '2009 04:05 Harold

No es 100% al grano, pero si por alguna razón no desea agregar sus archivos al índice como lo sugiere la respuesta aceptada, aquí tiene otra opción:

Si los archivos no tienen seguimiento, obviamente la diferencia es el archivo completo, por lo que puedes verlos con menos:

less $(git ls-files --others --exclude-standard)

Navegue entre ellos con :ny :ppara el siguiente y el anterior.

Actualización de los comentarios: si necesita un formato de parche, también puede combinarlo con git diff:

git ls-files --others --exclude-standard -z | xargs -0 -n 1 git --no-pager diff /dev/null | less

También puedes redirigir la salida a un archivo o usar otro comando diff en este caso.

user1587520 avatar Feb 18 '2016 14:02 user1587520

Para mi git cotidiano interactivo (donde comparo el árbol de trabajo con el HEAD todo el tiempo y me gustaría incluir archivos sin seguimiento en la diferencia), add -N/--intent-to-addno se puede utilizar porque se rompe git stash .

Así que aquí está mi git diffreemplazo. No es una solución particularmente limpia, pero como realmente solo la uso de forma interactiva, estoy de acuerdo con un truco:

d() {
    if test "$#" = 0; then
        (
            git diff --color
            git ls-files --others --exclude-standard |
                while read -r i; do git diff --color -- /dev/null "$i"; done
        ) | `git config --get core.pager`
    else
        git diff "$@"
    fi
}

Escribir simplemente dincluirá archivos sin seguimiento en la diferencia (que es lo que me importa en mi flujo de trabajo) y d args...se comportará como un archivo git diff.

Notas:

  • Estamos usando el hecho de que en git diffrealidad son solo diferencias individuales concatenadas, por lo que no es posible distinguir el dresultado de una "diferencia real", excepto por el hecho de que todos los archivos sin seguimiento se ordenan en último lugar.
  • El único problema con esta función es que la salida se colorea incluso cuando se redirige; pero no puedo molestarme en agregar lógica para eso.
  • No pude encontrar ninguna manera de incluir archivos sin seguimiento simplemente reuniendo una lista de argumentos ingeniosos para git diff. Si alguien descubre cómo hacer esto, o si tal vez se agregue una función giten algún momento en el futuro, ¡deje una nota aquí!
Jo Liss avatar Feb 01 '2011 15:02 Jo Liss