¿Puedo usar git diff en archivos sin seguimiento?
¿Es posible solicitar git diff
que se incluyan archivos sin seguimiento en su salida de diferencias, o lo mejor que puedo hacer es usarlos git add
en los archivos recién creados y en los archivos existentes que he editado, luego usar:
git diff --cached
Con las versiones recientes de git, puede crear git add -N
el 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 stash
mientras tenga un --intent-to-add
archivo 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í).
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
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 :n
y :p
para 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.
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-add
no se puede utilizar porque se rompe git stash
.
Así que aquí está mi git diff
reemplazo. 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 d
incluirá 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 diff
realidad son solo diferencias individuales concatenadas, por lo que no es posible distinguir eld
resultado 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óngit
en algún momento en el futuro, ¡deje una nota aquí!