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.