git difftool, abra todos los archivos diff inmediatamente, no en serie

240

El comportamiento predeterminado de git diff es abrir cada archivo diff en serie (espere a que se cierre el archivo anterior antes de abrir el siguiente).

Estoy buscando una manera de abrir todos los archivos a la vez; en BeyondCompare, por ejemplo, esto abriría todos los archivos en pestañas dentro de la misma ventana BC.

Esto facilitaría la revisión de un conjunto complejo de cambios; deslice hacia atrás y hacia adelante entre los archivos diff e ignore los archivos sin importancia.

Seba Illingworth
fuente
"git diff" o "git difftool"? Es posible que desee publicar la solicitud en la lista de correo de git (abierta para todos y con una vasta interfaz web): [email protected]
Jakub Narębski
Estoy usando "git difftool" para activar la aplicación de diferencia externa. Gracias por la idea de la lista de correo.
Seba Illingworth el
Sería útil conocer la plataforma. En una plataforma basada en Unix, escribiría un script para realizar el diff e instruir a git para que use ese script. En el script, simplemente ejecutaba el diff en segundo plano y luego dejaba que el script muriera.
Chris Cleeland
Plataforma de Windows, pero gracias por las ideas Chris.
Seba Illingworth
1
Para mergetool: stackoverflow.com/questions/39259116/…
Ciro Santilli 郝海东 冠状 病 六四 事件 法轮功

Respuestas:

214

A partir de gitv1.7.11, puede utilizar git difftool --dir-diffpara realizar un directorio diff.

Esta característica funciona bien con Meld 3.14.2 por ejemplo, y le permite explorar todos los archivos modificados:

git difftool --dir-diff --tool=meld HEAD~ HEAD

Esta es una práctica función Bash:

git-diff-meld() (
  git difftool --dir-diff --tool=meld "${1:-HEAD~}" "${2:-HEAD}"
)

La respuesta que sigue se aplica a las gitinstalaciones anteriores a v1.7.11.


Esta misma pregunta se hizo en la lista de correo de git .

Arme un script de shell basado en ese hilo de correo electrónico que realiza una diferencia de directorio entre confirmaciones arbitrarias.

A partir de git v1.7.10, el git-diffallscript se incluye en la contribinstalación estándar de git.

Para versiones anteriores a v1.7.10, puede instalar desde el git-diffallproyecto en GitHub .

Aquí está la descripción del proyecto:

El script git-diffall proporciona un mecanismo de diferencias basado en directorios para git. El script se basa en la opción de configuración diff.tool para determinar qué visor diff se usa.

Este script es compatible con todos los formularios utilizados para especificar un rango de revisiones a diff:

1) git diffall: muestra la diferencia entre el árbol de trabajo y los cambios por etapas
2) git diffall --cached [<commit>]: muestra la diferencia entre los cambios por etapas y HEAD (u otra confirmación con nombre)
3) git diffall <commit>: muestra la diferencia entre el árbol de trabajo y la confirmación con nombre
4) git diffall <commit> <commit>: muestra la diferencia entre dos confirmaciones con nombre
5) git diffall <commit>..<commit>: igual como arriba
6) git diffall <commit>...<commit>: muestra los cambios en la rama que contiene y hasta el segundo, comenzando en un antepasado común de ambos<commit>

Nota: todas las formas toman un limitador de ruta opcional [--] [<path>]

Este script se basa en un ejemplo proporcionado por Thomas Rast en la lista de Git .

Tim Henigan
fuente
¿Cuál es la diferencia entre git-diffall y github.com/wmanley/git-meld ? Probé ambos y parecen proporcionar una funcionalidad idéntica a primera vista.
kynan
55
Por mi parte, aprecio mucho tu guión. Francamente, no puedo entender por qué Git no se comporta de la manera correcta a este respecto (Mercurial lo hace, y lo ha hecho durante años), ni puedo entender la falta de interés de la comunidad de Git.
Douglas
66
Actualización (sobre git difftool --dir-diffy más allá de la comparación): me puse en contacto con Scooter Software (autores de Beyond Compare) y me dijeron que bcompare.exeno es una solución compatible y que puede causar problemas si hay más de un diferencial abierto a la vez. Planean agregar soporte para las diferencias de carpeta bcomp.exeen una versión futura (mientras tanto, continuaré usando bcompare.execomo una solución no admitida).
Peter Rust
44
@coin que acabo de probar con Beyond Compare 4 y --dir-diff parece funcionar con el bcomp.exe compatible.
Peter Rust
55
Solo comentando para decir que --dir-difffunciona perfectamente con Meld. A partir de ahí, le permitirá seleccionar y ver diferencias para archivos individuales.
mkasberg
61

Esto es lo que decidí ...

Copie el siguiente código en un archivo llamado git-diffall(sin extensión):

#!/bin/sh
git diff --name-only "$@" | while read filename; do
    git difftool "$@" --no-prompt "$filename" &
done

Coloque el archivo en la cmdcarpeta de su directorio de instalación de git (p. Ej.C:\Program Files (x86)\Git\cmd )

Y usa como lo harías git diff:

git diffall
git diffall HEAD
git diffall --cached 
git diffall rev1..rev2
etc...

Notas: La clave es el & param que le dice al comando diff externo que se ejecute en una tarea en segundo plano para que los archivos se procesen de inmediato. En el caso de BeyondCompare, esto abre una pantalla con cada archivo en su propia pestaña.

Seba Illingworth
fuente
Gracias por publicar. Desafortunadamente, no funciona con la opción -s de WinMerge. Todos los archivos temporales, excepto el primero, se eliminan antes de que WinMerge los vea.
Carlos Rendon
Carlos: Yo uso WinMerge con Git. Mi enfoque consistía en agregar un "sueño 1" después de iniciar WinMerge (que en mi caso parece que ya se inicia "en segundo plano", no es necesario &). De esta forma, el archivo temporal dura el tiempo suficiente para que WinMerge lo recoja una vez (excepto en casos extraños). También significa que lleva 1 segundo por archivo abrirlos todos. Es un truco desagradable (¡nunca lo presentaría como una "respuesta"!), Pero fácil y bastante efectivo.
Woody Zenfell III
2
Para usar en Linux, con Git 2.x, tuve que hacer una ligera modificación: cambiar "$filename"a "../$filename". Entonces funcionó perfectamente con Beyond Compare
Dave C
1
@DaveC en el hilo original que dice "almacenar el archivo en la carpeta cmd de su instalación de git" y continúa con un ejemplo en Windows. ¿Dónde almacenaste el archivo "git-diffall" en Linux?
m4l490n
2
¿Necesitamos reiniciar Windows después de agregar el git-diffallarchivo a la C:\Program Files\Git\cmdcarpeta? Hice exactamente lo que me $ git diffall git: 'diffall' is not a git command. See 'git --help'. Did you mean this? difftool
indicaron,
19

meld tiene una característica ordenada que si le da un directorio bajo control de origen (Git, Mercurial, Subversion, Bazaar y probablemente otros), enumerará automáticamente todos los archivos modificados y puede hacer doble clic para ver las diferencias individuales.

En mi opinión, es mucho más fácil escribir meld .y descifrar el VCS que configurar su VCS para que se inicie meld. Además, puede usar el mismo comando sin importar qué VCS esté usando su proyecto, lo cual es excelente si cambia mucho entre ellos.

El único inconveniente es que la fusión es más lenta para buscar cambios que para pasar los cambios desde git / hg / svn, aunque estoy seguro de que si es lo suficientemente lento como para ser un problema dependerá de cómo lo esté usando.

Tom
fuente
44
Para mí, el principal inconveniente es que la fusión (por cualquier razón) abre el diff en una nueva ventana en lugar de una nueva pestaña y después de cerrar el diff, el archivo en el directorio de trabajo se abre en una nueva pestaña con un mensaje emergente molesto antes.
kynan
Buena herramienta pero horrible instalación de Windows (a principios de 2012).
Wernight 01 de
@kynan Esto parece ser la solución perfecta para una forma agnóstica de VCS de diferenciarse si no fuera por esa molesta ventana emergente de doble ventana. Es una pena. :(
PKKid
Una gran característica de meld son sus filtros diff: ignora los cambios, por ejemplo, en los comentarios o agrega / git diffelimina líneas en blanco, lo que no ofrece.
kynan
1
He usado este enfoque durante un año más o menos; funciona bien para proyectos más pequeños, pero una vez que tiene un proyecto grande (es decir, muchos archivos) es increíblemente lento ya que "escanea" manualmente las diferencias de git (no estoy seguro de por qué toma este enfoque cuando git claramente puede proporcionarle una lista de archivos directamente ...)
namuol
3

Encontré este método (GitDiff.bat y GitDiff.rb) que copia los archivos en directorios temporales antiguos / nuevos y luego compara una carpeta en ellos.

Pero prefiero ver los archivos de trabajo directamente (desde el directorio de trabajo), ya que BeyondCompare tiene la práctica función de poder editar el archivo desde la ventana de diferencias, lo cual es ideal para realizar limpiezas rápidas.

Editar: un método similar aquí en respuesta a mi pregunta en la lista de correo de git.

Seba Illingworth
fuente
3

git meld=> https://github.com/wmanley/git-meld es un script increíble que abrirá una clara diferencia de todos los archivos en una sola ventana.

Khaja Minhajuddin
fuente
¡Funciona genial! Como una ventaja adicional, funciona exactamente como hg meld. ¡Gracias!
PKKid
2

Noté aquí que Araxis Merge tiene una opción de comando '-ahora':

-ahora evita que la comparación espere a que se cierre una comparación

Tal vez esto devuelva un código de salida inmediato y funcione, ¿alguien lo ha experimentado? No puedo encontrar una opción similar para BeyondCompare ...

Seba Illingworth
fuente
2

Diffuse también tiene integración VCS. Interopera con una gran cantidad de otros VCS, incluidos SVN, Mercurial, Bazaar, ... Para Git, incluso mostrará tres paneles si se realizan algunos pero no todos los cambios. En el caso de conflictos, incluso habrá cuatro paneles.

Captura de pantalla de difusa con ediciones escalonadas y no escalonadas

Invocarlo con

diffuse -m

en tu copia de trabajo de Git.

Si me preguntas, la mejor diferencia visual que he visto en una década. (Y también he intentado fusionar).

krlmlr
fuente
¿Puedes decir qué parte de difusa te gustó, especialmente sobre la fusión?
musiphil
@musiphil: Me gusta su simplicidad: parece tener el conjunto exacto de características necesarias para resolver la tarea, no más, pero tampoco menos. (Al igual que la realineación de las diferencias y el ancho del tamaño de la pestaña). No recuerdo por qué cambié de fusión, y no he usado fusión desde entonces, así que realmente no puedo compararlos ahora.
krlmlr
1
Diffuse trabajó con git sin ninguna configuración. Diffuse -m abre una sola ventana con git diffs en diferentes pestañas; mientras que otras herramientas necesitan demasiada configuración para comenzar.
Mosh
1

Si todo lo que quiere hacer es abrir todos los archivos que están actualmente modificados, intente algo como:

vi $ (estado de git | sed -n '/.*modified: * / s /// p')

Si realiza confirmaciones de "conjuntos complejos de cambios", es posible que desee reconsiderar su flujo de trabajo. Una de las características realmente agradables de git es que facilita al desarrollador reducir los complejos conjuntos de cambios a una serie de parches simples. En lugar de intentar editar todos los archivos que están modificados actualmente, es posible que desee examinar

git add - parche
lo que te permitirá organizar selectivamente trozos.

William Pursell
fuente
1

He escrito un script de PowerShell que duplicará dos árboles de trabajo y se comparará con DiffMerge. Entonces puedes hacer:

GitNdiff master~3 .

Para comparar la rama maestra hace tres registros con el árbol de trabajo actual, por ejemplo.

Es brillante y nuevo y probablemente lleno de errores. Un inconveniente es que los archivos en su árbol de trabajo que aún no se han agregado se copian en ambos árboles de trabajo. También puede ser lento.

http://github.com/fschwiet/GitNdiff

Frank Schwieterman
fuente
1

Para aquellos interesados ​​en usar git-diffall en Mac OS X con Araxis, bifurqué el proyecto git-diffall en github y agregué un AppleScript que envuelve el comando Araxis Merge. Nota: este es un clon ligeramente modificado dearaxisgitdiff archivo que se incluye con Araxis Merge para Mac OS X.

https://github.com/sorens/git-diffall

dolor
fuente
1

Lo siguiente funciona con meld y kdiff3

git difftool --dir-diff origin/branch1..origin/branch2

Abre todos los archivos en una ventana que puede explorar con facilidad. Se puede usar con conjuntos de cambios en lugar de origen / nombre de sucursal

p.ej: git difftool --dir-diff origin/master..24604fb72f7e16ed44115fbd88b447779cc74bb1

feltspar
fuente
-2

Puedes usar gitk y ver todas las diferencias al mismo tiempo

Aragorn
fuente
3
Sí, creo que gitk es útil, pero cuando se trata de diferenciar BC es lo que quiero ver :)
Seba Illingworth