tipos tag remove practices etiquetas crear best git diff msysgit winmerge

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

  1. 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/""

  2. 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 (-)"