Cuando lo hago svn commit y dejo que mi editor svn lo recoja ME ENCANTARÍA que el editor svn muestre la diferencia de los archivos que han cambiado en lugar de solo la lista de archivos. Realmente ayuda a trotar la memoria al escribir mensajes detallados de compromiso. ¿Alguna idea sobre cómo lograrlo?Make SVN Commit también imprime el diff
Respuesta
Parece que el script aquí funciona después de todo.
De - http://push.cx/2007/seeing-subversion-diffs-for-commit-messages
necesario hacer algunos cambios.Voy a pegar todo el guión aquí
crear un archivo, el nombre de svn en este caso se trata de poner en ~/bin
#!/bin/sh
REALSVN=/usr/bin/svn
ARGS="[email protected]"
if [ "$1" = "commit" -o "$1" = "ci" ]; then
shift # pop off $1 for diff
TEMPLATE=`mktemp -t tmp`
$REALSVN diff "[email protected]" > "$TEMPLATE"
$REALSVN $ARGS --editor-cmd="~/bin/svn-diff-editor '$TEMPLATE'"
else
$REALSVN $ARGS
fi
y también crear un archivo llamado ~/bin/SVN-diff-editor
echo >> "$2"
cat "$1" >> "$2"
rm "$1"
$SVN_EDITOR "$2"
para OSX he tenido que añadir la '-t tmp' a mktmp y el guión tenía orig $ visual que no tenía y tenía $ SVN_EDITOR establecido, en vez, una vez que cambié la última línea de sVN-diff -editor a eso funcionó.
, debo tener en cuenta que ambos archivos deben ser chmod + x'd y ~/bin debe ser el primero en su camino ... o simplemente poner esto en cualquier lugar que esté delante del svn real en tu camino – dstarh
escribir un guión
Haría falta algo de trabajo, pero se podría escribir un script para usuario como su SVN_EDITOR. Cuando svn
invoca su SVN_EDITOR, pasa el nombre de un archivo de comentario temporal generado por svn que contiene la lista de resumen de los archivos afectados a comprometer.
http://svnbook.red-bean.com/en/1.5/svn-book.html#svn.advanced.externaleditors
The value of any of these options or variables is the beginning of a command line to be executed by the shell. Subversion appends to that command line a space and the pathname of a temporary file to be edited. So, to be used with Subversion, the configured or specified editor needs to support an invocation in which its last command-line parameter is a file to be edited, and it should be able to save the file in place and return a zero exit code to indicate success.
Posiblemente, se podría escribir un script que toma un parámetro de nombre de archivo que:
- abre el archivo indicado por el último arg (el SVN archivo de comentarios temporal)
- lo analiza para que se confirmen los archivos
- ejecuta
svn diff
en cada archivo modificado (no binario) y agrega los archivos salida del FF de nuevo al final del archivo de comentarios temporal SVN - invoca su verdadero editor en el archivo de comentarios SVN temporal modificado
Asegúrese de que el script devuelve el código de retorno devuelto por su editor real o 0 para indicar el éxito . Luego configure su env de SVN_EDITOR para que apunte a su script.
Tal vez alguien ya haya escrito una secuencia de comandos, pero no pude encontrar ninguna (especialmente porque no indicó un sistema operativo). También hay una gran posibilidad de que este script pueda generar un archivo extremadamente grande.
Alternativa - escribir una macro
creo que una mejor alternativa sería utilizar un editor programable y programar una macro que lee un nombre de archivo (s) a partir de una cierta línea (s) seleccionado y luego ejecutar SVN diff en el (los) archivo (s) - colocando los resultados en un búfer o añadiéndolo al búfer en uso. A continuación, puede resaltar selectivamente los archivos del archivo de comentario temporal svn y ejecutar diff SVN solo en los archivos clave que necesita. ¡Suena como un trabajo para elisp!
Lo siento, no tengo un código ya hecho para usted. Si haces cualquiera de estos, sería interesante volver y publicar tu script/macro aquí como respuesta.
Escribí un guión simple y establecer SVN_EDITOR
a su paso:
#!/bin/bash
tmpFile="${!#}"
# Append changes in committed files to tmpFile
echo >> ${tmpFile}
grep '^[MR]' ${tmpFile} | awk '{print $2}' | \
xargs -n 1 --no-run-if-empty svn diff >> ${tmpFile}
# Run editor
exec ${EDITOR} ${tmpFile}
Nota que sólo busca modificado (M) y archivos reemplazados (R) y asume EDITOR
se establece. Probablemente no debería intentar diferir archivos binarios.
solución interesante. Me gusta mucho la salida de diff que SVN tiene de forma predeterminada, que es lo que quería: la salida de confirmación habitual solo enumera los archivos y el estado, pero svn diff le proporcionará el diseño de diff adecuado sin tener que llamar a svn diff en cada archivo por separado. – dstarh
No he podido encontrar una respuesta que me haya gustado usar. La respuesta de dstarh está casi allí. Pero es demasiado intrusivo para mí. ¿Qué pasa si hay argumentos antes de commit
? Además, es más seguro eliminar el archivo temporal con una trampa. Y agradar a la gente paranoica, me escape de las cmd editor:
svn-commit.sh
:
#!/usr/bin/env bash
set -eu
tmp=`mktemp` _trap="rm -r "$tmp"; ${_trap:-}" && trap "$_trap" EXIT
svn diff "[email protected]" > "$tmp"
# svn diff "[email protected]" | iconv -f utf-8 -t utf-8 -c > "$tmp" # skip malformed UTF-8 characters
svn commit "[email protected]" "--editor-cmd=svn-editor.sh $(printf %q "$tmp")"
svn-editor.sh
:
#!/usr/bin/env bash
set -eu
diff_f=$1
commit_msg_f=$2
# dos2unix "$diff_f" # if svn repo has files with different line-ending styles
# dos2unix -f "$diff_f" # to make it always treat diff output as text
echo >> "$commit_msg_f"
cat "$diff_f" >> "$commit_msg_f"
"$EDITOR" "$commit_msg_f"
UPD me he encontrado con este error:
svn: E135000: Commit failed (details follow):
svn: E135000: Error normalizing edited contents to internal format
svn: E135000: Inconsistent line ending style
svn: E135000: Your commit message was left in a temporary file:
svn: E135000: '.../svn-commit.tmp'
Se podría considerar addi ng dos2unix
comando o algo como se hace en el comentario.
UPD Además, es posible que desee skip malformed UTF-8 characters, o de lo contrario SVN fallará:
svn: E000022: Commit failed (details follow):
svn: E000022: Error normalizing edited contents to internal format
svn: E000022: Valid UTF-8 data
(hex: 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 0a 2b 0a 2b)
followed by invalid UTF-8 sequence
(hex: a4 20 3d 20)
svn: E000022: Your commit message was left in a temporary file:
svn: E000022: '.../svn-commit.tmp'
UPD Y de vez en cuando dos2unix
podría tratar diff
salida como binario:
dos2unix: Binary symbol 0x00 found at line 742308
dos2unix: Skipping binary file /tmp/tmp.UCNcubZZlX
svn: E135000: Commit failed (details follow):
svn: E135000: Error normalizing edited contents to internal format
svn: E135000: Inconsistent line ending style
svn: E135000: Your commit message was left in a temporary file:
svn: E135000: '.../svn-commit.tmp'
Usted puede querer forzar la conversión
- 1. svn branch commit - commit experimental
- 2. make alias para el repositorio svn
- 3. svn commit to multiple repositories
- 4. Pretty SVN commit emails: templates
- 5. svn diff cuando los archivos están marcados con "historial programado con commit"
- 6. ¿Cómo hacer que diff se vea como svn diff?
- 7. Cómo obtener NO contexto al usar svn diff
- 8. Incluyendo nuevos archivos en SVN diff
- 9. `svn merge` produce resultados diferentes que` diff` SVN
- 10. Trigger hudson build cuando svn commit
- 11. Proteger los archivos de svn commit
- 12. ¿Cómo hacer svn commit como usuario diferente?
- 13. diff SVN en 2 repositorios diferentes
- 14. Git Diff entre HEAD y SVN Master
- 15. No se puede svn diff usando meld
- 16. SVN: Crear un diff para muchas revisiones
- 17. svn diff para un archivo completo?
- 18. svn diff no muestra archivos externos modificados
- 19. svn diff: archivo marcado como tipo binario
- 20. Usando Tortoise SVN diff en TFS
- 21. SVN post-commit hook no ejecuta el archivo
- 22. Post-commit de SVN: ¿quién es el usuario que confirma?
- 23. ¿git almacena información de diff en los objetos de commit?
- 24. También use coma como separador de palabras en diff
- 25. git - cambio en el resumen del archivo como svn diff --summarize/svn status from console (no gitk)
- 26. ¿Cómo hacer que svn diff produzca el archivo que aplicaría el parche, cuando se usaba svn cp o svn mv?
- 27. Implementando `make check` o` make test`
- 28. Visual SVN diff y comparar herramientas para Linux
- 29. SVN commit Error "Commit solo puede comprometerse con un solo repositorio a la vez".
- 30. ¿Qué significa la línea meta "@@ ... @@" con los signos en svn diff o git diff?
Con TortoiseSVN (y muchos otros) puede hacer doble clic en cualquier archivo de esa lista para ver una diferencia. También puede seleccionar múltiples y hacer clic derecho en diff. – JoshD
estoy hablando de línea de comando en un terminal donde he establecido la propiedad SVN_EDITOR y apunto a vim o textmate que hacen resaltado de sintaxis automática para el commit o diff, dependiendo de qué canalice. – dstarh
@Josh puedo fácilmente svn diff | mate y vea la diferencia de cualquier cosa que haya cambiado, pero cuando escribo svn commit y mate o vim lo carga, actualmente solo muestra una lista de archivos a través del estado svn, realmente me gustaría ver debajo el resultado de svn diff – dstarh