Me gustaría poder resolver conflictos usando kdiff3, cuando SVN me notifica sobre el conflicto. ¿Cómo puedo configurarlo como una herramienta predeterminada para esto?Cómo configurar kdiff3 como herramienta de combinación para SVN
Respuesta
Ir al archivo de configuración de Subversion (/etc/subversion/config
o ~/.subversion/config
), y estableció merge-tool-cmd
variable, con su herramienta favorita:
### Set merge-tool-cmd to the command used to invoke your external
### merging tool of choice. Subversion will pass 4 arguments to
### the specified command: base theirs mine merged
# merge-tool-cmd = merge_command
A pesar de que hay un problema con kdiff3 que no admite cuatro argumentos lisos (SVN cuatro pases argumentos de civil a kdiff3, y no funciona), por lo que generalmente se llama con un simple script para traducir los argumentos, por ejemplo, "kdiff3caller":
#!/bin/sh
kdiff3 "$1" "$2" "$3" -o "$4"
Este problema kdiff3 y sol se explica here.
Encontré este script en algún lugar que no recuerdo. pero el autor es Michael Bradley.
Mi respuesta es similar a las respuestas de Jon Ander Ortiz Durántez. Entonces, si su respuesta no funciona, tienes una copia de seguridad. Una vez intenté algo como sugirió, pero siempre producía algún error con los parámetros hasta que encontré estos scripts que resolvieron todo.
Cree un archivo de comandos y establecer diff-cmd = /path/to/script.sh
en su ~/.subversion/config
#!/bin/bash # Return an errorcode of 0 on successful merge, 1 if unresolved conflicts # remain in the result. Any other errorcode will be treated as fatal. # Author: Michael Bradley #NOTE: all output must be redirected to stderr with "1>&2" as all stdout output is written to the output file # Must be called by subversion in "~/.subversion/config" file # Add config : "diff-cmd = /path/to/script/myKdiff3.sh" VDIFF3="kdiff3" DIFF3="diff3" DIFF="kdiff3" promptUser() { read answer case "${answer}" in "M" ) echo "" 1>&2 echo "Attempting to merge ${baseFileName} with ${DIFF}" 1>&2 $VDIFF3 $older $mine $theirs --L1 $labelOlder --L2 $labelMine --L3 $labelTheirs -o $output 1>&2 bLoop=1 if [ -f $output ]; then if [ -s $output ]; then #output succesfully written bLoop=0 fi fi if [ $bLoop = 0 ]; then cat $output rm -f $output exit 0 else echo "Merge failed, try again" 1>&2 fi ;; "m" ) echo "" 1>&2 echo "Attempting to auto-merge ${baseFileName}" 1>&2 diff3 -L $labelMine -L $labelOlder -L $labelTheirs -Em $mine $older $theirs > $output if [ $? = 1 ]; then #Can't auto merge rm -f $output $VDIFF3 $older $mine $theirs --L1 $labelOlder --L2 $labelMine --L3 $labelTheirs -o $output --auto 1>&2 bLoop=1 if [ -f $output ]; then if [ -s $output ]; then #output succesfully written bLoop=0 fi fi if [ $bLoop = 0 ]; then cat $output rm -f $output exit 0 else echo "Merge failed, try again" 1>&2 fi else #We can automerge, and we already did it cat $output rm -f $output exit 0 fi ;; "diff3" | "Diff3" | "DIFF3" ) echo "" 1>&2 echo "Diffing..." 1>&2 $VDIFF3 $older $mine $theirs --L1 $labelOlder --L2 $labelMine --L3 $labelTheirs 1>&2 ;; "diff" | "Diff" | "DIFF" ) echo "" 1>&2 echo "Diffing..." 1>&2 $DIFF $mine $theirs -L $labelMine -L $labelTheirs 1>&2 ;; "A" | "a" ) echo "" 1>&2 echo "Accepting remote version of file..." 1>&2 cat ${theirs} exit 0 ;; "I" | "i" ) echo "" 1>&2 echo "Keeping local modifications..." 1>&2 cat ${mine} exit 0 ;; "R" | "r" ) echo "" 1>&2 echo "Reverting to base..." 1>&2 cat ${older} exit 0 ;; "D" | "d" ) echo "" 1>&2 echo "Runnig diff3..." 1>&2 diff3 -L $labelMine -L $labelOlder -L $labelTheirs -Em $mine $older $theirs #Exit with return vaule of the diff3 (to write out files if necessary) exit $? ;; "S" | "s" ) echo "" 1>&2 echo "Saving for later..." 1>&2 cat ${mine} #Exit with return vaule of 1 to force writting of files exit 1 ;; "Fail" | "fail" | "FAIL" ) echo "" 1>&2 echo "Failing..." 1>&2 exit 2 ;; "H" | "h" ) echo "" 1>&2 echo "USAGE OPTIONS:" 1>&2 echo " [A]ccept Accept $labelTheirs and throw out local modifications" 1>&2 echo " [D]efault Use diff3 to merge files (same behavior as vanilla SVN)" 1>&2 echo " [Fail] Kills the command (not suggested)" 1>&2 echo " [H]elp Print this message" 1>&2 echo " [I]gnore Keep your locally modified version as is" 1>&2 echo " [M]erge Manually merge using ${VDIFF3}" 1>&2 echo " [m]erge Same as "M" but attempts to automerge if possible" 1>&2 echo " [R]evert Revert to base version (${labelOlder})" 1>&2 echo " [S]ave Same as 'I' but writes out rold, rnew, and rmine files to deal with later" 1>&2 echo " [diff] Type 'diff' to diff versions $labelMine and $labelTheirsthe before making a descision" 1>&2 echo " [diff3] Type 'diff3' to diff all three versions before making a descision" 1>&2 echo "" 1>&2 ;; * ) echo "'${answer}' is not an option, try again." 1>&2 ;; esac } if [ -z $2 ] then echo ERROR: This script expects to be called by subversion exit 1 fi if [ $2 = "-m" ] then #Setup vars labelMine=${4} labelOlder=${6} labelTheirs=${8} mine=${9} older=${10} theirs=${11} output=${9}.svnDiff3TempOutput baseFileName=`echo $mine | sed -e "s/.tmp$//"` #Prompt user for direction while [ 1 ] do echo "" 1>&2 echo "${baseFileName} requires merging." 1>&2 echo "" 1>&2 echo "What would you like to do?" 1>&2 echo "[M]erge [A]ccept [I]gnore [R]evert [D]efault [H]elp" 1>&2 promptUser done else L="-L" #Argument option for left label R="-L" #Argument option for right label label1=$3 #Left label label2=$5 #Right label file1=$6 #Left file file2=$7 #Right file $DIFF $file1 $file2 $L "$label1" $L "$label2" & #$DIFF $file1 $file2 & #wait for the command to finish wait fi exit 0
Ese script no podrá manejar nombres de archivos con espacios sin muchas correcciones a sus presupuestos, cambiando las referencias a '$ older' to be' "$ older" 'y cosas por el estilo. –
Quizás lo encontraste [aquí] (https://negativesum.net/tech/log/using-kdiff3-with-svn/)? –
@ AdamSpiers, gracias por la fuente. – yvoyer
El guión de la respuesta de yvoyer funciona muy bien para mí, y estoy usando SVN 1.4. Creo que la respuesta anterior de Jon Ander Ortiz Durántez funciona para SVN 1.5 y posteriores, y esta secuencia de comandos funciona para versiones SVN anteriores a 1.5. Parece que hubo cambios en --diff-cmd & --diff3-cmd para la versión 1.5. Comparación de secuencias de comandos en las siguientes 2 docs SVN para ver algunas diferencias:
- svnbook.red-bean.com/en/1.4/svn.advanced.externaldifftools &
- svnbook.red-bean.com/en/1.5/svn.advanced.externaldifftools.
guión de Michael Bradley es realmente útil ya que ahora si consigo un conflicto durante svn update
que se inicia en kdiff3 en lugar de vomitar todo el archivo con las marcas de conflicto ">>>>>>>>", que son tan difíciles para resolver si tienes confictos complejos. El diff3-cmd funciona tanto para fusión como para actualización.
agrego diff3-cmd = /usr/local/bin/svndiff3
a ~/.subversion/config
(o utilice --diff3-cmd
en el cmdline) desde que escribí mi propio guión para enviar a svn diff
sdiff y se especifica por --diff-cmd
.
Este script se publica en yolinux, y una versión ligeramente modificada (que maneja la fusión automática) se publica aquí Jawspeak.
Una solución que es más corto y funciona con las versiones posteriores de SVN SVN (probado en 1.7.7):
Crear un script ~/SVN-merge-kdiff
#!/bin/bash
# Useful when something fails
LOG=~/svn-merge-kdiff-last-run.log
echo "arguments passed to $0: [email protected]" > $LOG
# Now, don't think you will get the $1, $2, etc... by referencing.
# At first, you have to copy it to an array
for i in [email protected]; do
args=(${args[@]} $i)
done
echo "parsed args" >> $LOG
for i in ${args[@]}; do
echo $i >> $LOG
done
# I keep it in case something changes
if [ "${args[1]}" == "-m" ] && [ "${args[2]}" == "-L" ] && [ "${args[3]}" == ".mine" ];then
command="kdiff3 --L1 ${args[5]} --base ${args[9]} --L2 ${args[7]} ${args[10]} --L3 ${args[3]} ${args[8]} -o merged"
$command
if [[ $? -ne 0 ]]; then
echo "$command failed" >> $LOG
exit 1
fi
# You have to do this, otherwise after the merge you will see... empty file(?)
cat merged
rm merged
exit 0
fi
exit -1
ligarlo a svn en ~ /.subversion/config
diff3-cmd = ~/svn-merge-kdiff
No funciona en SVN 1.7.18, desafortunadamente – villapx
- 1. kdiff3 de combinación no funciona
- 2. integración de smartgit y kdiff3
- 3. ¿Cuál es la mejor herramienta de combinación visual para Git?
- 4. Guardar combinaciones usando KDiff3 con TortoiseSVN
- 5. Use WinMerge como herramienta de combinación de TortoiseHG
- 6. Mejor herramienta de combinación para Subversion
- 7. ¿Cómo usar p4merge como la herramienta merge/diff para Mercurial?
- 8. Usando kdiff3 para editar diffs con git
- 9. Cómo configurar un proxy HTTP para svn
- 10. Herramienta de análisis SVN
- 11. Herramienta de desarrollador para configurar IIS6
- 12. Herramienta para migrar de SVN a TFS
- 13. ¿Configurar un servidor SVN?
- 14. Herramienta de combinación de línea de comando similar a GUI (como BeyondCompare o WinMerge) para Linux
- 15. Herramienta (o combinación de herramientas) para entornos reproducibles en Python
- 16. ¿Cómo obtener herramientas de combinación externas para trabajar con svn en Linux?
- 17. ¿Cómo configurar un número de revisión para svn externo?
- 18. Combinación de múltiples repositorios SVN en uno
- 19. git-svn branching: cómo configurar git config
- 20. Firebug como herramienta para WPF?
- 21. ¿Cómo configurar la resolución de conflictos svn con meld?
- 22. Cómo configurar svn: ignorar con múltiples valores?
- 23. ¿Cómo configurar el repositorio SVN en XCode?
- 24. Herramienta de administración de administrador SVN
- 25. Usando git-svn (o similar) * solo * para ayudar con una combinación de svn?
- 26. kdiff3 doen no mostrar uft8
- 27. GVim como herramienta de fusión para TFS
- 28. Configurar la herramienta Eclipse para ejecutar un comando de Windows
- 29. herramienta de combinación de 3 vías no gráfica
- 30. Cambio por defecto SVN diffing herramienta
Voy a probar eso y ver cómo funciona. – gruszczy
Para trabajar también con nombres de archivos que contienen espacios, use 'kdiff3" $ 1 "" $ 2 "" $ 3 "-o" $ 4 "'. – hlovdal
Para mí, comienza kdiff3 bien, pero parece que no funciona. Hago una combinación de svn, cuando hay un conflicto que hago "launch (l)" y abre kdiff3 pero luego parece que la fusión no funciona. Se guarda en .svn/tmp pero el comando svn merge simplemente se repite preguntándome nuevamente qué hacer. EDITAR: OK, mi mal. Sí, trabajo, pero primero hay que hacer un (l) lanzamiento, hacer la fusión, y luego seleccionar (r) resolver. – PapaFreud