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

El comportamiento pnetworkingeterminado de diferencia de git es abrir cada file de diff en serie (esperar a que se cierre el file anterior antes de abrir el siguiente file).

Estoy buscando una manera de abrir todos los files a la vez: en BeyondCompare, por ejemplo, esto abriría todos los files en tabs dentro de la misma window BC.

Esto haría más fácil revisar un set complejo de cambios; retroceda y avance entre los files de diferencias e ignore los files sin importancia.

Comenzando con git v1.7.11, puede usar git difftool --dir-diff para realizar una diferencia de directory.

La respuesta que sigue se aplica a las instalaciones de git anteriores a v1.7.11.


Esta misma pregunta fue hecha en la list de correo git .

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

Comenzando con git v1.7.10, el script git-diffall se incluye en la contrib de la installation estándar de git.

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

Aquí está la descripción del proyecto:

La secuencia de commands git-diffall proporciona un mecanismo de diferencia basado en directory para git. El script se basa en la opción de configuration diff.tool para determinar qué diff viewer se usa.

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

1) git diffall : muestra la diferencia entre el tree de trabajo y los cambios escalonados
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 tree de trabajo y el commit nombrado
4) git diffall <commit> <commit> : muestra diff entre dos commits nombrados
5) git diffall <commit>..<commit> : igual que arriba
6) git diffall <commit>...<commit> : muestra los cambios en la twig que contiene y hasta el segundo, comenzando en un ancestro común de ambos <commit>

Nota: todos los formularios tienen un limitador de ruta opcional [--] [<path>]

Esta secuencia de commands se basa en un ejemplo proporcionado por Thomas Rast en la list de Git .

Esto es lo que decidí …

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

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

Coloque el file en la carpeta cmd de su directory de installation de git (por ejemplo, C:\Program Files (x86)\Git\cmd )

Y usar como lo haría git diff :

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

Notas: La key es it & param que le dice al command diff externo que se ejecute en una tarea en segundo plano para que los files se procesen inmediatamente. En el caso de BeyondCompare esto abre una pantalla con cada file en su propia pestaña.

meld tiene una clara característica de que si le das un directory bajo control de fuente (Git, Mercurial, Subversion, Bazaar y probablemente otros) enumerará automáticamente todos los files modificados y puedes hacer doble clic para ver las diferencias individuales.

IMO es mucho más fácil escribir meld . y haga que descubra el VCS que configure su VCS para iniciar la meld . Además, puede usar el mismo command sin importar qué VCS esté usando su proyecto, lo cual es excelente si cambia mucho entre ellos.

El único inconveniente es que es más lento para meld escanear para cambios que para pasar los cambios de git / hg / svn, aunque si es lo suficientemente lento como para ser un problema dependerá de cómo lo está utilizando, estoy seguro.

Encontré este método (GitDiff.bat y GitDiff.rb) que copy los files en directorys antiguos / nuevos y luego hace una comparación de carpetas en ellos.

Pero prefiero ver los files de trabajo directamente (desde el directory de trabajo), ya que BeyondCompare tiene la práctica function de poder editar el file desde la window diff, que es ideal para realizar una limpieza rápida.

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

git meld => https://github.com/wmanley/git-meld es una secuencia de commands impresionante que abrirá una clara diferencia de todos los files en una sola window.

Notado aquí que Araxis Merge tiene una opción de command '-nowait':

-nowait Evita comparar de esperar que se cierre una comparación

Tal vez esto devuelva un código de salida inmediato y funcionaría, ¿alguien experimentó esto? No se puede encontrar una opción similar para BeyondCompare …

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

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

Si está realizando confirmaciones de "sets de cambios complejos", es posible que desee reconsiderar su flujo de trabajo. Una de las características realmente buenas de git es que hace que sea fácil para el desarrollador networkingucir sets de cambios complejos a una serie de parches simples. En lugar de tratar de editar todos los files que están actualmente modificados, es posible que desee examinar

  git add --patch 

que te permitirá seleccionar selectivamente a los tíos.

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

 GitNdiff master~3 . 

Para comparar la twig maestra tres hace checkins con el tree de trabajo actual, por ejemplo.

Es shiny y nuevo y probablemente lleno de errores. Una desventaja es que los files en su tree de trabajo que aún no se han agregado se copyn en ambos treees. También puede ser lento.

http://github.com/fschwiet/GitNdiff

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 ajusta el command Araxis Merge. Nota: este es un clon ligeramente modificado del file araxisgitdiff que se envía con Araxis Merge para Mac OS X.

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

Difuso 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 organizan algunos cambios, pero no todos. En el caso de conflictos, incluso habrá cuatro paneles.

Captura de pantalla de difusión con ediciones escalonadas y sin escena

Invocarlo con

 diffuse -m 

en tu copy de trabajo de Git.

Si me preguntas, las mejores diferencias visuales que he visto en una década. (Y también he intentado fusionar)

Puedes usar gitk y ver todas las diferencias al mismo time