unstaged create git whitespace patch

create - ¿Cómo se puede combinar git add patch-p mode con diff''s ignore-all-space?



git patch unstaged (4)

¿Cómo puedo hacer git add con modo de parche pero ignorando los cambios de espacios en blanco?

El caso de uso es para cuando has reformateado un archivo y también has realizado cambios en él. Quiero confirmar primero los cambios en el código real (como se muestra en git diff -w path) y luego confirmar el cambio de formato como un compromiso separado.


Nota : Esta respuesta es antigua. 6 años más tarde, la otra respuesta de Justin es mucho mejor. Prefiero usar git apply --cached

Sugiero simplemente ida y vuelta un diff

Idea:

git diff --ignore-all-space | (git reset --hard && git apply)

Advertencia : esto está lleno de peligro debido al git reset del git reset allí (no conservará los cambios a los archivos binarios como están escritos). Quizás quieras una función bash similar a

function cleanup_patch() { if [ $# -lt 1 ]; then echo ''Must provide explicit paths (wildcards allowed)''; else git diff --ignore-all-space -- "$@" | (git checkout HEAD -- "$@" && git apply) fi }

Afaict la opción aparentemente útil --binary para diff no --binary los espacios en blanco ignorar las banderas


Aquí hay una adaptación de una pregunta relacionada .

git diff -w --no-color | git apply --cached --ignore-whitespace

Tiene la ventaja de que no necesita usar stash , archivos temporales o realizar un reset --hard en sus carpetas de trabajo.

Apéndice

La solución anterior solo cambia las etapas, excepto las ediciones de solo espacios en blanco. Esto no abordó el parche, aunque usar --patch to stage no es sencillo en esta situación.

Opción de parche 1: Editar el dif en un editor de texto

Hay muchas maneras de implementar esto usando un editor de texto. Vim es especialmente adecuado para esto.

En el directorio raíz de su repositorio, inicie Vim.

En modo normal, cargue el diff en un búfer vacío con ...

:r !git diff -w --no-color :set ft=diff # if you want syntax highlighting

Edite el diff y elimine las partes que no quiere poner en escena.

Para configurar el contenido del búfer vim, ejecute el comando vim ex ...

:w !git apply --cached --ignore-whitespace

Si eres un aficionado al Vim, ¡también puedes usar el modo visual para poner en escena!

:<'',>''w !git apply --cached --ignore-whitespace

Puede cometer los cambios por etapas con el comando ex ...

:!git commit -m "message" # or :!git commit

Borre el búfer, lea los cambios sin programar y repita

:bd! | set ft=diff | r !git diff -w --no-color

Finalmente, solo te quedarán cambios de espacios en blanco para confirmar.

Si no usa Vim, también puede volcar git diff en un archivo, editar el archivo, guardar, y luego alimentar el archivo en git apply . Comprometerse y repetir hasta terminar. Es un poco tedioso, pero funcional.

Opción de parche 2: reajuste de parche

Está hacia atrás desde git add --patch , pero una vez que haya realizado cambios no en espacios en blanco con ...

git diff -w --no-color | git apply --cached --ignore-whitespace

... puedes desorganizar fragmentos en modo patch con ...

git reset --patch .

Tenga en cuenta que está eliminando los cambios que desea mantener en escena. Repita y confirme según sea necesario hasta que solo le queden cambios de espacios en blanco.


Si desea hacer git add --patch pero ignorar todos los espacios en blanco como pregunta el que pregunta, puede hacerlo con un solo comando:

git diff -w --no-color | git apply --cached --ignore-whitespace && git checkout -- . && git reset && git add -p

git diff -w --no-color crea un diff

git apply --cached --ignore-whitespace aplica el git apply --cached --ignore-whitespace ignorar diff, y lo indexa

git checkout -- . elimina los cambios de "espacio en blanco" no indexados

git reset restablece el índice solo a los cambios que no son espacios en blanco

git add -p agrega los cambios que no son espacios en blanco en el modo de parche

Envuelve esto en un alias, así:

alias gwap=“git diff -U0 -w --no-color | git apply --cached --ignore-whitespace --unidiff-zero && git checkout -- . && git reset && git add -p”

O si estás en un sistema basado en Unix como yo:

gwap= !git diff -U0 -w --no-color | git apply --cached --ignore-whitespace --unidiff-zero && git checkout -- . && git reset && git add -p

(Tenga en cuenta que agregué las opciones -U0 , y --unidiff-zero respectivamente, a los problemas de coincidencia de contexto de solución alternativa, de acuerdo con este comentario ) .

Fuente: https://til.hashrocket.com/posts/696df00135-remove-whitespace-changes-then-git-add-p


Una versión más robusta y versátil de la respuesta de @ "Justin C" es:

anw = !git diff -U0 -w --no-color -- /"$@/" | git apply --cached --ignore-whitespace --unidiff-zero "#"

  • Sin argumentos: agrega todos los cambios de espacio en blanco de todos los archivos rastreados
  • Archivos / directorios dados: solo agrega cambios que no sean espacios en blanco en esas ubicaciones

Vea esta respuesta para más.