Agregar solo cambios que no sean espacios en blanco
Tengo mi editor de texto para recortar automáticamente los espacios en blanco finales al guardar un archivo y estoy contribuyendo a un proyecto de código abierto que tiene graves problemas con los espacios en blanco finales.
Cada vez que intento enviar un parche, primero debo ignorar manualmente todos los cambios de espacios en blanco para elegir solo la información relevante. No sólo eso, sino que cuando corro git rebase
normalmente me encuentro con varios problemas a causa de ellos.
Como tal, me gustaría poder agregar al índice solo cambios que no sean espacios en blanco, de manera similar git add -p
, pero sin tener que seleccionar todos los cambios yo mismo.
¿Alguien sabe como hacer esto?
EDITAR: No puedo cambiar la forma en que funciona el proyecto y han decidido, después de discutirlo en la lista de correo, ignorarlo.
La solución @Frew no era exactamente lo que necesitaba, así que este es el alias que creé exactamente para el mismo problema:
alias.addnw=!sh -c 'git diff -U0 -w --no-color --src-prefix=a/ --dst-prefix=b/ "$@" | git apply --cached --ignore-whitespace --unidiff-zero -'
O simplemente puedes ejecutar:
git diff -U0 -w --no-color --src-prefix=a/ --dst-prefix=b/ | git apply --cached --ignore-whitespace --unidiff-zero -
Actualizar
Se agregaron opciones -U0
y, --unidiff-zero
respectivamente, para solucionar problemas de coincidencia de contexto, según este comentario .
Básicamente, aplica el parche que se aplicaría add
sin cambios en los espacios en blanco. Notarás que después de a git addnw your/file
todavía habrá cambios sin realizar, solo quedarán los espacios en blanco.
--no-color no es obligatorio, pero como tengo los colores configurados para siempre, tengo que usarlo. De todos modos, más vale prevenir que curar.
Advertencia
Si bien este truco funciona tal como está, si intentas usarlo para eliminar cambios en líneas en blanco, --ignore-blank-lines
las cosas se complican. Con esta opción, git diff
simplemente se eliminarán algunos fragmentos, lo que hará que el parche resultante sea falso, ya que los números de línea en el archivo de destino estarán incorrectos.
Cree un archivo de parche que contenga solo los cambios reales (excluyendo las líneas con solo cambios de espacios en blanco), luego limpie su espacio de trabajo y aplique ese archivo de parche:
git diff > copia de seguridad
git diff -w > cambios
git reset --hard
patch < cambios
Revise las diferencias restantes, luego add
y commit
como de costumbre.
El equivalente para Mercurial es hacer esto:
hg diff > copia de seguridad
hg diff -w > cambios
hg revertir --todas
las importaciones de hg --sin confirmar cambios