2012-09-14 8 views
19

Me gustaría utilizar el algoritmo de paciencia de diff de Git (el que obtienes si invocas git diff con el argumento --patience) con git add -p. ¿Cómo puedo hacer esto?Usa el algoritmo de paciencia de diff de Git para agregar interactivamente

Antecedentes: Estoy trabajando con algunos archivos XML, y git diff es el algoritmo normal produces pretty poor diffs due to "misaligned" entry/exit tags. Si ejecuto git diff --patience, obtengo diffs mucho más útiles, pero no hay una forma obvia de usar estos diffs en git add -p.

+3

No estoy seguro de que puedas hacer eso ahora, pero suena como una sugerencia digna de hacer a los desarrolladores 'git' ... De hecho, puede haber otras opciones' git diff' que serían útiles para exponer a 'git add' y otros lugares donde se realiza un' default-ish 'git diff' ... – twalberg

+0

vea esta línea en el código: https://github.com/git/git/blob/master/builtin /add.c#L273 – greg0ire

Respuesta

30

git add -p actualmente rechaza banderas diff, pero se puede utilizar la opción de configuración diff.algorithm:

git config --global diff.algorithm patience 

nuevo en Git 1.8.2.

+1

¡Dulce! Ahora solo tengo que esperar a que Cygwin Git se ponga al día ... –

+0

¿También debería cambiar el algoritmo para la confirmación de git? – fantastory

4

Hmmmm ... Una cosa que podría hacer es canalizar la salida de git diff a un lugar temporal, a continuación, leyó de nuevo con git apply:

git diff --patience <commitA> <commitB> > /tmp/patch.out 
# checkout a new branch or otherwise do what you need to prep 
git apply < /tmp/patch.out 

Eso va a aplicar la salida del diff al directorio de trabajo, pero no confirmará ni realizará los cambios. Luego puede ejecutar git add -p como lo haría normalmente, y el --patience diff serán los cambios que está agregando interactivamente.

No hay ninguna razón por la que no pueda conectar el diff al directamente, si se adapta mejor a su flujo de trabajo. Es algo que hago bastante regularmente cuando reconstruyo mis propias sucursales locales para la integración de producción.

Parece que también se puede utilizar como un merge strategy, por lo que podría darse el caso de que en lugar de añadir de forma interactiva los diferenciales, simplemente podría crear una rama con lo que desea, y luego fusionar en.

+0

Eso es lo que estoy haciendo actualmente; me permite editar el parche, que es esencialmente lo que me gustaría hacer con 'git add -p'. Esto simplemente parece tristemente más tedioso de lo que debería ser. –

+0

@me_and Se agregaron algunas notas sobre el uso como una estrategia de combinación, también. Tal vez podría generar una rama de combinación de basura con solo los cambios que deseaba, luego use la estrategia de combinación para obtener un mejor resultado. – Christopher

10

Esto funcionó para mí:

git -c diff.algorithm=patience add -p [...] 

Me postulo la última v2.1.0 git en Cygwin.

+2

Sí, como @Tobu ya se indicó en la respuesta aceptada, esa bandera de configuración se agregó en Git v1.8.2. Resulta que la forma de obtener una versión actualizada de Git en Cygwin es hacerse cargo del mantenimiento, que es exactamente lo que terminé haciendo :) –

+0

@me_and: entonces te agradezco que finalmente hayas actualizado las versiones de Cygwin git :) Ha estado inactivo por bastante tiempo. En cuanto a mi respuesta, solo quería mostrar que es posible cambiar una configuración en línea sin modificar las configuraciones globales. – Amro

+1

@me_y lo interesante aquí es que esta opción de configuración solo es temporal y se puede pasar como cli-flag de esta manera – ohcibi