Comience un mensaje de confirmación de git con un hashmark (#)

283

Git trata las líneas que comienzan #como líneas de comentarios al confirmar. Esto es muy molesto cuando se trabaja con un sistema de seguimiento de tickets y cuando se intenta escribir el número de ticket al comienzo de la línea, por ej.

#123 salt hashed passwords

git simplemente eliminará la línea del mensaje de confirmación. ¿Hay alguna forma de escapar del hash? Lo intenté \y !, pero nada funciona. los espacios en blanco anteriores #se conservan, por lo que tampoco son una solución funcional al problema.

knittl
fuente
8
@AlexBudovski porque hay valor en brevedad.
Xavi
8
Desde git 1.8.2 (febrero de 2013), git config core.commentcharpermite configurar ese carácter de comentario. Vea mi respuesta a continuación
VonC
3
Desde Git v2.0.0 (2014.05.21) git commit --cleanup=scissorsserá más flexible. Ver detalles en mi respuesta
Sungam,
44
Debo decir que me sorprende que la gente de GitHub no haya pensado en este problema cuando decidió marcar los números de los problemas con hashes.
Michael Scheper
1
@Michael Para ser justos, esta convención ya fue utilizada por Mantis, Trac, Redmine y probablemente otros. Supongo que GitHub simplemente decidió seguirlo en lugar de reinventar la rueda. Ver stackoverflow.com/questions/40495/…
kelvin

Respuestas:

235

Este comportamiento es parte del comportamiento git commitpredeterminado de 'limpieza'. Si desea que las líneas comiencen #, puede usar un modo de limpieza alternativo.

P.ej

git commit --cleanup=whitespace

Si hace esto, debe tener cuidado de eliminar todas las #líneas que no desea que aparezcan en la confirmación.

CB Bailey
fuente
La siguiente pregunta es: ¿Dónde puedo editar los comentarios del mensaje de confirmación que introduce git que comienzan por defecto con un #?
Alex
2
@Alex: está controlado por la commit.templatevariable de configuración git.
CB Bailey
23
Esto funciona muy bien para modificar las confirmaciones existentes también. Por ejemplo:git commit --amend --cleanup=whitespace
James Andres
@CharlesBailey: esperaba deshacerme del texto predefinido con git commit -t / dev / null pero todavía muestra eso
Alex
Como puede tener un mensaje de confirmación de "Mensaje de confirmación # 123", así como comentarios en clientes como GitHub para Mac y SourceTree, supongo que ¿qué están haciendo estos clientes?
Phil Ostler
134

Tenga en cuenta que, desde git1.8.2 (febrero de 2013) , puede usar un carácter diferente a '# ' para la línea comentada en el mensaje de confirmación.

Eso le permite usar ' #' para su referencia de número de error.

Varias líneas de "pistas" que Git da cuando le pide al usuario que edite mensajes en el editor se comentan con ' #' por defecto.

La core.commentCharvariable de configuración se puede utilizar para personalizar esto ' #' a un carácter diferente.


En teoría, podría poner una core.commentCharpalabra (varios caracteres), pero git 2.0.x / 2.1 será más estricto (Q3 2014).

Ver commit 50b54fd por Nguyễn Thái Ngọc Duy ( pclouds) :

config: sé estricto en core.commentChar

No admitimos cadenas de comentarios (al menos todavía no). Y la codificación de caracteres de varios bytes también podría malinterpretarse.

La prueba con dos comas se actualiza porque viola esto. Se agrega con el parche que se presenta core.commentCharen eff80a9 (Permitir "comentario personalizado" - 16/01/2013). No me queda claro por qué se desea ese comportamiento.


git 2.0.x / 2.1 (Q3 2014) agregará una selección automática para core.commentChar:
Ver commit 84c9dc2

Cuando core.commentChares " auto", el comentario char comienza con '# ' como predeterminado, pero si ya está en el mensaje preparado, busque otro carácter en un pequeño subconjunto. Esto debería detener las sorpresas porque git elimina algunas líneas inesperadamente.

Tenga en cuenta que git no es lo suficientemente inteligente como para reconocer ' #' como el comentario de caracteres en plantillas personalizadas y convertirlo si el comentario final es diferente.
Piensa en líneas '#' en plantillas personalizadas como parte del mensaje de confirmación. Así que no use esto con plantillas personalizadas.

La lista de caracteres candidatos para "auto" son:

# ; @ ! $ % ^ & | :

Eso significa que un comando como git commit -m '#1 fixed issue'cambiará automáticamente commentChar a ' ;', porque ' #' se usó en el mensaje de confirmación.

VonC
fuente
1
Para corregir la sintaxis HL después de esto, vea esta pregunta relacionada: stackoverflow.com/questions/16164624/…
Alois Mahdal
@Guten Cierto, he redactado la respuesta para reflejar eso.
VonC
1
@newbyca con qué versión de git ves que no es compatible durante un rebase interactivo?
VonC
2
Entonces, para configurar esto, puede hacer, por ejemplo:$ git config --global core.commentchar ';'
davetapley
66
Me encanta esta respuesta Oneliner para la nueva solución sugerida:git config --global core.commentChar auto
aross
81

Las respuestas aquí son buenas y detalladas, pero para un novato de git como yo, personalizar las opciones de configuración de git no es tan obvio. Aquí hay un ejemplo para cambiar de #a ;por caracteres de comentario:

git config core.commentChar ";"

Eso es todo lo que necesitas hacer.

Matthieu Napoli
fuente
3
¡Esto también cambia el texto comentado predeterminado que git agrega a un mensaje de confirmación cuando se usa git commitpara abrir el editor configurado para editar un mensaje de confirmación!
Michael Trouw
1
Para soluciones únicas, use esto: git -c core.commentChar="|" commit --amend(reemplace |con lo que quiera).
Droogans
62

Puede usar la opción de línea de comando -m:

git commit -m "#123 fixed"
Olivier Verdier
fuente
35
Pero este es un mensaje de compromiso horrible. asegúrese de incluir qué fue el error y cómo se solucionó
Good Person
3
los mensajes de confirmación están bien siempre que haya un número de error
Trident D'Gao
66
¡No si el sistema de seguimiento de errores se corrompe repentinamente y no tiene una copia de seguridad! :)
caveman_dick
38

Si está haciendo un rebase interactivo, cuando guarde su mensaje de confirmación sin nada (porque #al principio lo ha hecho un comentario y, por lo tanto, se ha ignorado), git le mostrará qué hacer:

Aborting commit due to empty commit message.
Could not amend commit after successfully picking 5e9159d9ce3a5c3c87a4fb7932fda4e53c7891db... 123 salt hashed passwords
This is most likely due to an empty commit message, or the pre-commit hook
failed. If the pre-commit hook failed, you may need to resolve the issue before
you are able to reword the commit.
You can amend the commit now, with

        git commit --amend

Once you are satisfied with your changes, run

        git rebase --continue

Entonces, solo modifique el mensaje:

git commit --amend -m "#123 salt hashed passwords"

y continúa la rebase:

git rebase --continue
Owain Williams
fuente
Esto es correcto para alguien que ya presionó el compromiso, pero quiere cambiar el mensaje
Hoang Trinh
También se aplica a los nuevos commits si ingresas un mensaje usando tu editor y tiene un hash al principio.
Owain Williams
29

git commit --cleanup=scissorsdebería ser usado. Se agregó a Git v2.0.0 en 2014.05.21

de git commit --help

--cleanup=<mode>
  scissors
    Same as whitespace, except that everything from (and including) the line
    "# ------------------------ >8 ------------------------" is truncated if the message
    is to be edited. "#" can be customized with core.commentChar.
Sungam
fuente
No entiendo cómo esto es mejor que usar commit.cleanup = whitespacey eliminar # …comentarios a mano, como ya ha sugerido @CharlesBailey. scissors-mode solo limpia adicionalmente la sintaxis de tijera utilizada por git format-patch/ mailinfo/ am; no utilizar la …-- >8 --…sintaxis al añadir comentarios a los mensajes de confirmación .
Slipp D. Thompson
1. Creo que es mejor porque no necesito "eliminar # ...comentarios por completo. 2. No estoy tan seguro de la segunda parte de tu comentario, el scissorsmodo definitivamente está en git commit --help. ¿Qué versión de gitestás usando? @ SlippD.Thompson
Sungam
¿Eh? whitespaceel modo ofrece la eliminación de 1. líneas vacías iniciales y finales, 2. espacios en blanco finales, 3. contraer líneas vacías consecutivas. scissorsofrece la eliminación de 1. líneas vacías iniciales y finales, 2. espacios en blanco finales, 3. colapsan líneas vacías consecutivas, 4. todo desde (e incluyendo) la línea # -…- >8 -…-. Sin embargo, las líneas de tijera ( # -…- >8 -…-) solo se insertan cuando se usa git-format-patch/ mailinfo/ am. Por lo tanto, para un flujo de trabajo git-commit/ merge/ rebase/ normal cherry-pick, el scissorsmodo de extracción ofrece cero beneficios sobre el whitespacemodo. v2.11.0
Slipp D. Thompson
@ SlippD.Thompson ¿Qué versión de git estás usando? Estoy usando 2.8.3 y git commit --cleanup=scissors antepone la # ------------------------ >8 ------------------------línea antes de la git statusinformación. Como a continuación: `# ------------------------> 8 ------------------- ----- # No toque la línea de arriba. # Todo lo siguiente se eliminará. # En la rama maestra # # Confirmación inicial # # Cambios a confirmar: # archivo nuevo: .gitignore `
Sungam
1
Creo que he llegado al fondo de esto. De hecho, Git inserta el # ------------------------ >8 ------------------------txt anterior al estado "Parece que puedes estar ..." _ cuando lo usas scissors; sin embargo, inserta la línea de tijera después del # Conflicts: …texto. Lo había commit.status = falseconfigurado en mi .gitconfig, así que no estaba viendo ningún texto de estado, solo el texto de conflictos. Estoy corregido; cambiando para votar.
Slipp D. Thompson
3

Use un prefijo diferente para el número de boleto. O anteponga una palabra al número de ticket, como "Bug # 42". O anteponga un solo carácter de espacio a la línea; si desea eliminar ese espacio en blanco, puede agregar un enlace de compromiso para eso.

Personalmente, preferiría que este tipo de manipulación de mensajes de compromiso no sea realizada por un gancho, ya que puede ser muy irritante cuando se activa cuando no lo desea. La solución más fácil es probablemente repensar el problema.

Wilhelmtell
fuente
1
una redacción diferente es solo una solución para el problema. Si las pautas del proyecto establecen que un mensaje de confirmación debe comenzar con la identificación del ticket, entonces no funcionará. y un gancho posterior a la confirmación es muy feo. creo que debería informar este "error" a los desarrolladores de git
knittl
No te molestes, eso estaría mal. No le pidas a los desarrolladores de git que trabajen de acuerdo con tus pautas. No le pediría a Dennis Ritchie que cambie el lenguaje C, por lo que admite la convención de nombres variables de comenzar con un carácter hash, ¿verdad? Lo mismo se aplica aquí. Si los mensajes de confirmación permiten comentarios, esto agrega soporte para cosas interesantes, como abrir el editor de confirmación con la diferencia agregada y comentada para que no necesite recordar sus cambios exactos. ¿Qué hay de malo en preservar el personaje principal del espacio?
wilhelmtell
1
apoyo caracteres de escape en git commit de mensaje no sería tal una gran cosa
knittl
55
Es una solicitud de función perfectamente razonable. Especialmente a la luz del hecho de que Trac, AFAICT, no asocia una confirmación a un error de error si el mensaje de confirmación no comienza con el número de error, comenzando con un hash. Entonces, no son solo los estándares de alguien, es la sintaxis requerida de una herramienta. Deje que los desarrolladores de Git decidan si vale la pena o no. (Y sí, Trac también podría solucionar el problema. No hay nada de malo en pedirle a Git que haga lo que pueda también.)
Luke Maurer
"Especialmente a la luz del hecho de que Trac, AFAICT, no asocia una confirmación a un error de error si el mensaje de confirmación no comienza con el número de error, comenzando con un hash". - en mi experiencia limitada con Trac, algo como #xxxocurrir en cualquier parte del mensaje de confirmación se vinculará con el problema. No tiene que ser al comienzo de la confirmación. ¿Quizás esto es algo que ha cambiado en los últimos cinco años?
Guildenstern el
1

Todos mis commits comienzan con, #issueNumberasí que pongo este repetitivo en mi vim .git/hooks/commit-msg:

NAME=$(git branch | grep '*' | sed 's/* //') 
echo "$NAME"' '$(cat "$1") > "$1"

Supongamos que tenemos una rama #15y hacemos un mensaje de confirmación add new awesome feature. Con este enfoque, el mensaje de confirmación final será #15 add new awesome feature.

valignatev
fuente