2010-11-22 22 views
12

Uno de mis flujos de trabajo favoritos con svn es utilizar la función de comparación de carpetas de Beyond Compare para ver las diferencias netas entre dos ramas, o una rama y el enlace. ¿Hay alguna manera de hacer esto en git sin tener que crear manualmente múltiples clones del mismo repositorio?Comparación de directorios de las sucursales de Git

Como hago esta pregunta, se me ocurre que podría escribir un script que clonar el repositorio actual a un directorio temporal, pago y envío de la rama deseada, y luego llamar a BCompare.exe con los dos directorios como argumentos. La vista de comparación de carpetas se invoca con

BCompare.exe path/to/folder1 path/to/folder2 

¿Suena razonable? ¿Podré eliminar el clon adicional una vez que haya terminado con Beyond Compare?

+0

"¿Podría eliminar el clon adicional ...?" porque no? – Cascabel

+0

Bueno, idealmente, me gustaría lanzar más allá de comparar en el fondo para poder continuar usando git en la misma terminal para ver el registro, etc. Con eso, no estoy seguro de qué es lo que detectaría cerrado más allá de comparar y es seguro eliminar el clon temporal. –

Respuesta

2

Parece que ya se haya averiguado la respuesta correcta - y utilizar git clonegit checkout para establecer un directorio para comparar con, a continuación, ejecutar BCompare.exe. La secuencia de comandos a continuación podría ser un buen punto de partida.

#!/bin/sh 
(        # execute in a subshell so you can continue 
           # working in the current shell 
    set -o xtrace    # bash setting that echos each command before it's executed 
    > /tmp/auto_bcompare_log # truncate existing log file 
    BRANCH="$1"    # get branch argument from command line 
    TEMPDIR=`mktemp -d`  # get a temp directory 
    CWD=`pwd`     # remember the current directory 
    git clone $CWD $TEMPDIR 
    cd $TEMPDIR 
    git checkout $BRANCH 
    cd $CWD 
    BCompare.exe $CWD $TEMPDIR 
    rm -rf $TEMPDIR 
) >> /tmp/auto_bcompare_log 2>&1 < /dev/null & # background and redirect 
               # stdout/stderr/stdin 
+0

Esto más o menos funcionó para mí.Saqué el material de registro porque prefería verlo en la línea de comandos, lo cogí para que funcionara con msysgit, y lo convertí en un alias. Lo bueno de que sea un alias es que puedes hacerlo en cualquier directorio del repositorio y funciona de manera automática. Opté por no usar() ya que siempre puedo usar & para que se ejecute en segundo plano. Alias ​​está en el siguiente comentario. –

+0

git config --global alias.ddiff '! Sh -c "TWD =/ddifftmp; mkdir $ TWD; CWD =' pwd'; git clon $ CWD/.git $ TWD; cd $ TWD; git pago de salida $ 1; cd $ CWD; BComp.exe $ TWD $ CWD; rm -rf $ TWD; ' –

0

Solo git diff con los nombres o hash de las ramas que desea comparar, tan simple como eso. En realidad, puedes comparar dos commits por sus hashes.

+0

Y si no me gusta la linealidad forzada de las comparaciones en línea de git diff y el ordenamiento arbitrario de archivos, ¿entonces soy SOL? Sé que también puedo 'git difftool b1 b2' pero eso no me da la vista de comparación de carpetas. –

+0

Hmm, lo siento, no recibí tu pregunta, pensé que estabas tratando de comparar dos compromisos. Estás usando beyondcompare como la herramienta diff que asumo, ¿verdad? Lamentablemente, no estoy familiarizado con eso. – ustun

+1

@drhorrible: Entonces su pregunta es cómo obtener esta "vista de comparación de carpetas" específica, no solo cómo ver la diferencia entre dos ramas. Podría querer editar para aclararlo un poco. – Cascabel

27

Este (compara directorios en lugar de archivo por archivo) debería estar disponible pronto:
Ver [ANNOUNCE] Git 1.7.11.rc1:

"git difftool" aprendieron la opción "--dir-diff" para desovar herramientas externas de diferencias que puede comparar dos jerarquías de directorios a la vez después de rellenar dos directorios temporales, en lugar de ejecutar una instancia de la herramienta externa una vez por cada par de archivos.

Ver "Patch difftool: teach difftool to handle directory diffs", de esta fork of git:

Cuando 'difftool' se llama para comparar una serie de confirmaciones que modifican más de un archivo, se abre una instancia independiente de la herramienta de diferencias de cada archivo que cambió

La nueva opción '--dir-diff' copia todos los archivos modificados en una ubicación temporal y ejecuta un directorio diff en ellos en una sola instancia de la herramienta diff.

+0

Si pudiera votar más de una vez, lo haría. Esto es perfecto y debería ser la respuesta aceptada. – joneshf

+0

OMG ¡Esto cambia mi vida! – stdcall

Cuestiones relacionadas