Estoy usando git con mi equipo y me gustaría eliminar los cambios de espacios en blanco de mis diferencias, registros, fusiones, etc. Supongo que la forma más fácil de hacerlo sería que git elimine automáticamente los espacios en blanco finales (y otros errores de espacios en blanco) ) de todas las confirmaciones a medida que se aplican.
Intenté agregar lo siguiente por ~/.gitconfig
archivo, pero no hace nada cuando me comprometo. Tal vez está diseñado para algo diferente. ¿Cual es la solución?
[core]
whitespace = trailing-space,space-before-tab
[apply]
whitespace = fix
Estoy usando ruby en caso de que alguien tenga alguna idea específica de ruby. El siguiente paso sería el formateo automático del código antes de comprometerse, pero ese es un problema difícil y realmente no está causando un gran problema.
git
whitespace
githooks
mloughran
fuente
fuente
Respuestas:
Esas configuraciones (
core.whitespace
yapply.whitespace
) no están ahí para eliminar los espacios en blanco finales sino para:core.whitespace
: detectarlos y generar erroresapply.whitespace
: y pelarlos, pero solo durante el parche, no "siempre automáticamente"Creo
git hook pre-commit
que haría un mejor trabajo para eso (incluye eliminar los espacios en blanco finales)Tenga en cuenta que en cualquier momento puede elegir no ejecutar el
pre-commit
enlace:git commit --no-verify .
cd .git/hooks/ ; chmod -x pre-commit
Advertencia: de forma predeterminada, una
pre-commit
secuencia de comandos (como esta ) no tiene una función de "eliminación final", sino una función de "advertencia" como:Sin embargo, podría construir un
pre-commit
gancho mejor , especialmente si considera que:Por ejemplo, oldman propone en otra respuesta un
pre-commit
gancho que detecta y elimina espacios en blanco.Dado que ese gancho obtiene el nombre de cada archivo, recomendaría tener cuidado con cierto tipo de archivos: ¡no desea eliminar los espacios en blanco finales en los
.md
archivos (rebajados)!fuente
apply.whitespace
, engañando a git para que trate sus cambios de copia de trabajo como un parche. Vea mi respuesta a continuación ..editorconfig
archivos tienen una regla específica para eso.<br>
: github.com/FriendsOfPHP/PHP-CS-Fixer/issues/…core.whitespace
atrailing-space
congit config
no genera error al cometer engit
2.5.0.Puedes engañar a Git para que arregle el espacio en blanco por ti, engañando a Git para que trate tus cambios como un parche. En contraste con las soluciones de "enlace previo al compromiso", estas soluciones agregan comandos de fijación de espacios en blanco a Git.
Sí, estos son hacks.
Soluciones robustas
Los siguientes alias de Git están tomados de mi
~/.gitconfig
.Por "robusto" quiero decir que estos alias se ejecutan sin error, haciendo lo correcto, independientemente de si el árbol o el índice están sucios. Sin embargo, no funcionan si un interactivo
git rebase -i
ya está en progreso; vea mi~/.gitconfig
para verificaciones adicionales si le importa este caso de esquina, donde elgit add -e
truco descrito al final debería funcionar.Si desea ejecutarlos directamente en el shell, sin crear un alias Git, simplemente copie y pegue todo entre las comillas dobles (suponiendo que su shell sea Bash).
Arregla el índice pero no el árbol
El siguiente
fixws
alias de Git corrige todos los errores de espacios en blanco en el índice, si los hay, pero no toca el árbol:La idea es correr
git fixws
antesgit commit
si tiene errores de espacio en blanco en el índice.Repara el índice y el árbol
El siguiente
fixws-global-tree-and-index
alias de Git corrige todos los errores de espacios en blanco en el índice y el árbol, si corresponde:Para corregir también los espacios en blanco en archivos no versionados, haga
Soluciones simples pero no robustas
Estas versiones son más fáciles de copiar y pegar, pero no hacen lo correcto si no se cumplen sus condiciones secundarias.
Repara el subárbol enraizado en el directorio actual (pero restablece el índice si no está vacío)
Utilizando
git add -e
para "editar" los parches con el editor de identidad:
:Repara y preserva el índice (pero falla si el árbol está sucio o el índice está vacío)
Repara el árbol y el índice (pero restablece el índice si no está vacío)
Explicación del
export GIT_EDITOR=: && git -c apply.whitespace=fix add -ue .
truco.Antes de conocer el
git rebase --whitespace=fix
truco de esta respuesta , estaba usando elgit add
truco más complicado en todas partes.Si lo hicimos manualmente:
Establezca
apply.whitespace
enfix
(solo tiene que hacer esto una vez):Esto le dice a Git que arregle espacios en blanco en parches .
Convence a Git para tratar tus cambios como un parche :
Presione a+ enterpara seleccionar todos los cambios para cada archivo. Recibirás una advertencia sobre Git arreglando tus errores de espacio en blanco.
(
git -c color.ui=auto diff
en este punto revela que sus cambios no indexados son exactamente los errores de espacio en blanco).Elimine los errores de espacio en blanco de su copia de trabajo:
Recupere sus cambios (si no está listo para confirmarlos):
El
GIT_EDITOR=:
medio para usar:
como editor y como comando:
es la identidad.fuente
set VISUAL= && git add -ue . && git checkout .
cuenta el '.
' utilizado congit add
: eso se debe a git1.8.3git commit
usar el editor incorrecto? Envuelvo laVISUAL=
parte en un subshell en mi versión de Unix anterior para evitar esto, pero no sé si DOS tiene subshells.core.editor
configurado, exportarVISUAL
no tiene ningún efecto porque la configuración tiene prioridad porman git-var
. Para anular esto, debe exportar en suGIT_EDITOR=:
lugar.fixws
para que falle rápidamente si ya estás en un rebase interactivo ya que de lo contrario morirá en lagit rebase --whitespace=fix
línea y te dejará en un estado extraño. Tomé prestado de esta pregunta y acabo de agregar un caso adicional antes del if:fixws = !"\ if test -d $(git rev-parse --git-dir)/rebase-merge ; then \ echo 'In rebase - cannot fixws' ; \ elif (! git diff-files --quiet .) && \ (! git diff-index --quiet --cached HEAD) ; then \ ...
Encontré un gancho de confirmación previa de git que elimina los espacios en blanco finales .
fuente
sed
invocación (sed -r 's/:[0-9]+:.*//'
) podría sustituirse porcut -f1 -d:
. Esto debería funcionar igual en plataformas basadas en Linux y BSD.cut
no es tan seguro como el segundosed
: el corte fallará en el caso (muy poco probable) de los nombres de archivo que contienen ":". Podríasawk 'NF>2{NF-=2}1'
estar a salvocore.autocrlf=true
, es posible que desee agregardos2unix -D "$FILE"
dentro del bucle for, después de sed. De lo contrario, cambiará todos los CRLF a LF emitiendo solo sed.git add
dentro de un gancho de compromiso me parece bastante malvado. ¿Qué sucede si está realizando una puesta en escena / confirmación parcial de un archivo? No desea que el archivo completo se confirme a sus espaldas, ¿verdad?En Mac OS (o, probablemente, cualquier BSD), los parámetros del comando sed tienen que ser ligeramente diferentes. Prueba esto:
Guarde este archivo como
.git/hooks/pre-commit
o busque el que ya está allí y pegue el fragmento inferior en algún lugar dentro de él. Y recuérdalochmod a+x
también.O para uso global (a través de Git commit hooks - configuración global ) puede ponerlo
$GIT_PREFIX/git-core/templates/hooks
(donde GIT_PREFIX es / usr o / usr / local o / usr / share o / opt / local / share) y ejecutargit init
dentro de sus repositorios existentes.De acuerdo a
git help init
:fuente
git hash-object -w
ygit update-index
(re) insertar el archivo modificado directamente en el índice. Alguien muy valiente.Prefiero dejar esta tarea a tu editor favorito.
Simplemente configure un comando para eliminar los espacios finales al guardar.
fuente
(add-hook 'before-save-hook 'delete-trailing-whitespace)
a su.emacs
archivo. Trucos de espacios en blanco de EmacsUsando atributos git, y la configuración de filtros con git config
OK, esta es una nueva táctica para resolver este problema ... Mi enfoque es no usar ningún gancho, sino usar filtros y atributos git. Lo que esto le permite hacer es configurar, en cada máquina en la que desarrolle, un conjunto de filtros que eliminarán el espacio en blanco adicional y las líneas en blanco adicionales al final de los archivos antes de confirmarlos. Luego configure un archivo .gitattributes que diga a qué tipos de archivos se debe aplicar el filtro. Los filtros tienen dos fases,
clean
que se aplican al agregar archivos al índice, ysmudge
que se aplica al agregarlos al directorio de trabajo.Dile a tu git que busque un archivo de atributos globales
Primero, dígale a su configuración global que use un archivo de atributos globales:
Crea filtros globales
Ahora, crea el filtro:
Agregue la magia de scripting sed
Finalmente, pon el
fixup-eol-eof
script en algún lugar de su ruta y hágalo ejecutable. La secuencia de comandos utiliza sed para realizar algunas modificaciones sobre la marcha (eliminar espacios y espacios en blanco al final de las líneas y líneas en blanco extrañas al final del archivo)fixup-eol-eof debería verse así:
mi esencia de esto
Dígale a git a qué tipos de archivo debe aplicar su filtro recién creado
Por último, cree o abra ~ / .gitattributes_global en su editor favorito y agregue líneas como:
Por lo tanto, si queremos solucionar el problema de los espacios en blanco, para todos nuestros archivos fuente c, agregaríamos una línea que se ve así:
Discusión del filtro.
El filtro tiene dos fases, la fase de limpieza que se aplica cuando las cosas se agregan al índice o se registran, y la fase de borrones cuando git pone cosas en su directorio de trabajo. Aquí, nuestra mancha solo está ejecutando el contenido a través del
cat
comando que debería dejarlos sin cambios, con la excepción de posiblemente agregar un carácter de nueva línea final si no hubiera uno al final del archivo. El comando clean es el filtro de espacios en blanco que improvisé a partir de notas en http://sed.sourceforge.net/sed1line.txt . Parece que debe colocarse en un script de shell, no pude descubrir cómo inyectar el comando sed, incluido el saneamiento de las líneas extrañas al final del archivo directamente en el archivo git-config. (Tú PUEDESsin embargo, sin la necesidad de un script sed separado, elimine los espacios en blanco al final, simplemente configurefilter.fix-eol-eof
algo comosed 's/[ \t]*$//' %f
donde\t
está una pestaña real, presionando la pestaña).Require = true hace que se genere un error si algo sale mal, para evitar problemas.
Perdóname si mi lenguaje sobre git es impreciso. Creo que entiendo bastante bien los conceptos, pero todavía estoy aprendiendo la terminología.
fuente
.git
carpeta en lugar de hacerlo globalmente, lo que podría tener más sentido.Escribí este enlace previo a la confirmación, que solo elimina el espacio en blanco final de las líneas que ha cambiado / agregado, ya que las sugerencias anteriores tienden a crear confirmaciones ilegibles si los archivos de destino tienen demasiado espacio en blanco final.
fuente
Pruebe mis ganchos de precompromiso , puede detectar automáticamente el espacio en blanco al final y eliminarlo . ¡Gracias!
puede funcionar debajo
GitBash(windows), Mac OS X and Linux
!Instantánea:
fuente
git commit -no-verify
alguna sugerencia..md
archivo y no eliminar los espacios en blanco, en lugar de pedirle al usuario final que agregue una--no-verify
opción en elgit commit
.+
o-
Aquí hay una versión compatible con ubuntu + mac os x:
Que te diviertas
fuente
Estaba pensando en esto hoy. Esto es todo lo que terminé haciendo para un proyecto de Java:
fuente
Para usuarios de Sublime Text .
Establezca lo siguiente correctamente en su configuración de Configuración-Usuario .
"trim_trailing_white_space_on_save": true
fuente
*.md
archivos (de reducción) que dependen de "" (espacios dobles finales) para marcar un simple<br />
, y esa configuración parece aplicarse a todos los archivos, incluidos los que no quiero eliminar.el for-loop para archivos usa la variable de shell $ IFS. en el script dado, los nombres de archivo con un carácter que también está en la variable $ IFS se verán como dos archivos diferentes en el ciclo for. Este script lo corrige: el modificador de modo multilínea dado que el manual de sed dado no parece funcionar de manera predeterminada en mi cuadro de ubuntu, así que busqué una implementación diferente y encontré esto con una etiqueta iterativa, esencialmente solo comenzará la sustitución en el última línea del archivo si lo he entendido correctamente.
[1] patrón de sed-subsition: ¿Cómo puedo reemplazar una nueva línea (\ n) usando sed? .
fuente
Esto no elimina los espacios en blanco automáticamente antes de una confirmación, pero es bastante fácil de realizar. Puse el siguiente script de Perl en un archivo llamado git-wsf (corrección de espacio en blanco git) en un directorio en $ PATH para que pueda:
git wsf | sh
y elimina todos los espacios en blanco solo de las líneas de archivos que git informa como una diferencia.
fuente
Un poco tarde, pero como esto podría ayudar a alguien, aquí va.
Abre el archivo en VIM. Para reemplazar las pestañas con espacios en blanco, escriba lo siguiente en la línea de comando vim
Para deshacerse de otros espacios en blanco finales
Esto prácticamente lo hizo por mí. Es tedioso si tienes muchos archivos para editar. Pero me resultó más fácil que preenganchar ganchos y trabajar con varios editores.
fuente
sed -i 's|\t| |g' filenames
(espacios en la posición de reemplazo). Tenga en cuenta que puede usar find para obtener sus nombres de archivo. Si no ha pensado en cómo obtener esa copia de seguridad, generalmente solo confirmo todo y luego 'deshago' la confirmación con un restablecimiento parcial de nuevo a donde estoy; a veces agrego todo al árbol pero no me comprometo, y a veces uso el alijo / aplicar (¡no pop!). Si me siento ansioso, RSYNC toda mi árbol a un lugar seguro antes de entrometerse ...Para eliminar espacios en blanco al final de la línea en un archivo de forma portátil, use
ed
:fuente
Esto probablemente no resolverá directamente su problema, pero es posible que desee establecerlos a través de git-config en su espacio de proyecto real, que edita ./.git/config en lugar de ~ / .gitconfig. Es bueno mantener la configuración consistente entre todos los miembros del proyecto.
fuente