remove - git tag best practices
usar Winmerge dentro de Git para archivar diff (8)
Actualización de junio de 2015, 6 años después:
Como se detalla en " git mergetool winmerge ", bastará con un simple git config diff.tool winmerge
.
¡Git 2.5+ (Q2, 2015) ahora es consciente de Winmerge como una herramienta de diferenciación o fusión!
Respuesta original (2009-2012)
(msysgit, 1.6.5, sesión de DOS)
La primera parte (usando winmerge) se describe en " ¿Cómo veo la salida ''git diff'' con el programa visual diff? "
C:/myGitRepo>git config --replace --global diff.tool winmerge
C:/myGitRepo>git config --replace --global difftool.winmerge.cmd "winmerge.sh /"$LOCAL/" /"$REMOTE/""
C:/myGitRepo>git config --replace --global difftool.prompt false
Con winmerge.sh
almacenado en una parte del directorio de tu PATH
:
#!/bin/sh
echo Launching WinMergeU.exe: $1 $2
"$PROGRAMFILES/WinMerge/WinMergeU.exe" -e -u -dl "Local" -dr "Remote" "$1" "$2"
(vea las opciones de línea de comandos de WinMerge )
git difftool
ahora lanzará WinMerge.
Si quieres que git diff
inicie WinMerge, simplemente configura:
set GIT_EXTERNAL_DIFF=winmerge.sh
Pero el verdadero valor agregado proviene de la capacidad de usar esa misma herramienta de diferencias para presentar todas las diferencias en un lote en lugar de presentarlas secuencialmente, lo que obliga a cerrar las ventanas de la herramienta diff un archivo a la vez.
Actualización de junio de 2012 (2 años y medio después):
La comparación de directorios en lugar de archivo por archivo estará disponible pronto:
Ver [ANUNCIAR] Git 1.7.11.rc1 :
"
git difftool
" aprendió la--dir-diff
"--dir-diff
" para engendrar herramientas de diferencias externas que pueden comparar dos jerarquías de directorios a la vez después de--dir-diff
dos directorios temporales, en lugar de ejecutar una instancia de la herramienta externa una vez por cada par de archivos .
Consulte " Patch difftool
: teach difftool
para manejar las diferencias de directorio ", y la respuesta " Comparación de directorios de las ramas de Git " para más detalles.
Script original difftool by directories (diciembre de 2009)
Como menciona Seba Illingworth en su respuesta , un script git-diffall.sh (también puesto en el camino) puede hacer eso:
#!/bin/sh
git diff --name-only "$@" | while read filename; do
git difftool "$@" --no-prompt "$filename" &
done
Pero eso solo funciona abriendo n ventanas para n archivos (si intentas usar la opción -s
de WinMerge, no funcionará debido a que los archivos temporales son eliminados por difftool demasiado pronto)
Es por eso que me gusta el enfoque de GitDiff.bat - power-diffing con GI , que le permite revisar la lista de archivos con una diferencia, antes de seleccionar uno para examinar sus diferencias internas.
Lo he ajustado para usar solo comandos de DOS
@echo off
setlocal
if "%1" == "-?" (
echo GitDiff - enables diffing of file lists, instead of having to serially
echo diff files without being able to go back to a previous file.
echo Command-line options are passed through to git diff.
echo If GIT_FOLDER_DIFF is set, it is used to diff the file lists. Default is windff.
goto END
)
if "%GIT_DIFF_COPY_FILES%"=="" (
rd /s /q %TEMP%/GitDiff
mkdir %TEMP%/GitDiff
mkdir %TEMP%/GitDiff/old
mkdir %TEMP%/GitDiff/new
REM This batch file will be called by git diff. This env var indicates whether it is
REM being called directly, or inside git diff
set GIT_DIFF_COPY_FILES=1
set GIT_DIFF_OLD_FILES=%TEMP%/GitDiff/old
set GIT_DIFF_NEW_FILES=%TEMP%/GitDiff/new
set GIT_EXTERNAL_DIFF=%~dp0/GitDiff.bat
echo Please wait and press q when you see "(END)" printed in reverse color...
call git diff %*
if defined GIT_FOLDER_DIFF (
REM This command using GIT_FOLDER_DIFF just does not work for some reason.
%GIT_FOLDER_DIFF% %TEMP%/GitDiff/old %TEMP%/GitDiff/new
goto END
)
if exist "%ProgramFiles%/Beyond Compare 2/BC2.exe" (
set GIT_FOLDER_DIFF="%ProgramFiles%/Beyond Compare 2/BC2.exe"
"%ProgramFiles%/Beyond Compare 2/BC2.exe" %TEMP%/GitDiff/old %TEMP%/GitDiff/new
goto END
)
"%ProgramFiles(x86)%/WinMerge/WinMergeU.exe" -r -e -dl "Local" -dr "Remote" %TEMP%/GitDiff/old %TEMP%/GitDiff/new
goto END
)
REM diff is called by git with 7 parameters:
REM path old-file old-hex old-mode new-file new-hex new-mode
copy %TEMP%/%~nx2 %GIT_DIFF_OLD_FILES%/%1
copy %5 %GIT_DIFF_NEW_FILES%
:END
No es lo suficientemente robusto como para manejar archivos con los mismos nombres en diferentes directorios, pero le da una idea general de lo que es posible:
Aquí solo se abrirá un WinMerge, con la lista de archivos con diferencias internas. Puede hacer clic en los que quiere examinar, luego un simple ESC cerrará la sesión de WinMerge-diff
.
¿Hay alguna manera de usar Winmerge dentro de git para hacer Diffs?
Dado que el hilo se está volviendo confuso y bifurcado, aquí hay instrucciones consolidadas para el listado de directorios "--dir-diff" Método WinMerge para msysgit Git Windows.
Paso 1 : crea un archivo llamado winmerge.sh en una ubicación accesible para tu ruta (como /home/bin/winmerge.sh) con los siguientes contenidos.
#!/bin/sh
echo Launching WinMergeU.exe: $1 $2
"$PROGRAMFILES/WinMerge/WinMergeU.exe" -r -ub -dl "Remote" -dr "Local" "$1" "$2"
Paso 2 : escribe los siguientes comandos en Git Bash para indicar a git que use winmerge.sh como difftool (estas opciones se almacenan en /home/.gitconfig):
git config --replace --global diff.tool winmerge
git config --replace --global difftool.winmerge.cmd "winmerge.sh /"$LOCAL/" /"$REMOTE/""
git config --replace --global difftool.prompt false
Paso 3 - Ahora puedes probar escribiendo el siguiente comando en Git Bash para iniciar tu WinMerge diff:
git difftool --dir-diff
Paso 4 : para un acceso más rápido, cree un alias para este comando agregando esta línea a .bashrc en su carpeta de inicio (o cree un archivo .bashrc con esta línea si el archivo aún no existe):
alias diffdir=''git difftool --dir-diff''
Paso 5 - Ahora puedes ver rápidamente un diff en WinMerge simplemente escribiendo el siguiente comando en Git Bash
diffdir
En Windows puedes hacerlo de esta manera:
1) Abra el archivo .gitconfig. Está ubicado en el directorio de inicio: c: / users / username.gitconfig
2) Agregue las líneas a continuación. Preste atención a las comillas simples que envuelven el camino hacia winmerge:
[diff]
tool = winmerge
[difftool "winmerge"]
cmd = "''C:/Program Files (x86)/WinMerge/WinMergeU.exe''" -e "$LOCAL" "$REMOTE"
[difftool]
prompt = false
[merge]
tool = winmerge
[mergetool "winmerge"]
cmd = "''C:/Program Files (x86)/WinMerge/WinMergeU.exe''" /"$MERGED/" /"$REMOTE/"
[mergetool]
keepBackup = false
trustExitCode = false
Estaba confundido acerca de por qué la solución se presentó como un archivo por lotes de DOS, ya que mi instalación de Git incluía un shell bash. Tampoco pude obtener un contexto de DOS desde bash, así que intenté adaptar lo que previamente se compartía en un contexto de bash.
Como git diff
parece ejecutar el comando especificado una vez para cada archivo, divido mi solución en dos scripts bash:
Primero, configure gitprepdiff.sh
para que sea el difftool como se mencionó anteriormente
#!/bin/sh
#echo ...gitprepdiff.sh
cp -v $1 "$TMP/GitDiff/old/$2"
cp -v $2 "$TMP/GitDiff/new"
También noté que los resultados de los comandos de git configure
se pueden encontrar y editar directamente en C:/Users/<username>/.gitconfigure
gitdiff.sh
se ejecuta en la línea de comandos donde normalmente llamarías a git diff
#!/bin/sh
#echo Running gitdiff.sh...
DIFFTEMP=$TMP/GitDiff
echo Deleting and re-creating $DIFFTEMP...
rm -rf $DIFFTEMP;
mkdir $DIFFTEMP;
echo Creating $DIFFTEMP/old...
mkdir $DIFFTEMP/old;
echo Creating $DIFFTEMP/new...
mkdir $DIFFTEMP/new;
git diff --name-only "$@" | while read filename; do
git difftool "$@" --no-prompt "$filename";
done
"$PROGRAMFILES/WinMerge/WinMergeU.exe" -r -e -dl "Repository" -dr "Working" $LOCALAPPDATA//Temp//1//GitDiff//old $LOCALAPPDATA//Temp//1//GitDiff//new
También vale la pena señalar que, en mi instalación, /tmp
(en bash) mapeado a %LOCALAPPDATA%/Temp/1/
(en Windows), por eso estoy usando este último en mi llamada a WinMerge.
Sin configuración:
git difftool --tool winmerge
Asumiendo:
- Winmerge está instalado
- Git para Windows está instalado, desde "git version 2.12.0.windows1" o superior (aunque las versiones anteriores de git pueden haber introducido el comando).
Tengo un script que establecerá las herramientas Diff y Merge en la configuración de Git con los parámetros adecuados que no requieren un archivo .sh por separado. Parece estar funcionando bien para mí.
git config --global diff.tool winmerge
git config --global difftool.prompt false
git config --global difftool.winmerge.cmd "/"/$PROGRAMFILES/"/WinMerge/WinMergeU.exe -r -u -e -dl /"Local/" -dr /"Remote/" /"/$LOCAL/" /"/$REMOTE/""
git config --global merge.tool winmerge
git config --global mergetool.prompt false
git config --global mergetool.winmerge.trustExitCode true
git config --global mergetool.winmerge.cmd "/"/$PROGRAMFILES/"/WinMerge/WinMergeU.exe -r -u -e -dl /"Local/" -dr /"Remote/" /"/$LOCAL/" /"/$REMOTE/" /"/$BASE/" /"/$MERGED/""
Nota : toda la porción .cmd se cita para que los parámetros se enumeren en .gitconfig correctamente
Tuve problemas para usar la primera parte en 2 lugares y lo arreglé de la siguiente manera
El segundo comando para configurar winmerge.cmd requería una barra extra en cmdline (antes de $ LOCAL y $ REMOTE), de lo contrario, cygwin sustituía la variable en cmdline
C:/myGitRepo>git config --replace --global difftool.winmerge.cmd "winmerge.sh /"/$LOCAL/" /"/$REMOTE/""
Cambió el archivo winmerge.sh a (sin esto, obtenía el error correcto de ruta de acceso)
#!/bin/sh echo Launching WinMergeU.exe: "$(cygpath -aw "$1")" "$(cygpath -aw "$2")" "$PROGRAMFILES/WinMerge/WinMergeU.exe" -e -ub -dl "Base" -dr "Mine" "$(cygpath -aw "$1")" "$(cygpath -aw "$2")"
git config --global diff.tool winmerge
git config --global difftool.winmerge.cmd "/"$PROGRAMFILES//WinMerge//WinMergeU.exe/" -u -dl /"Local/" -dr /"Remote/" /"/$LOCAL/" /"/$REMOTE/""
git config --global difftool.prompt false
De acuerdo con el manual de la línea de comandos de WinMerge : "Los parámetros tienen el prefijo de barra diagonal (/) o guión (-)"