Inicie uma mensagem de confirmação do git com uma marca de hash (#)

283

O Git trata as linhas que começam com #linhas de comentário ao confirmar. isso é muito irritante ao trabalhar com um sistema de rastreamento de tickets e ao tentar escrever o número do ticket no início da linha, por exemplo,

#123 salt hashed passwords

O git simplesmente removerá a linha da mensagem de confirmação. existe alguma maneira de escapar do hash? Eu tentei \e !, mas nada funciona. espaços em branco antes #são preservados, portanto também não são uma solução funcional para o problema.

knittl
fonte
8
@AlexBudovski porque há valor na brevidade.
Xavi
8
Desde o git 1.8.2 (fevereiro de 2013), git config core.commentcharpermite configurar esse caractere de comentário. Veja minha resposta abaixo
VonC
3
Desde o Git v2.0.0 (2014.05.21) git commit --cleanup=scissorsserá mais flexível. Veja detalhes na minha resposta
Sungam
4
Devo dizer que estou surpreso que o pessoal do GitHub não tenha pensado nesse problema quando decidiu marcar números de problemas com hashes!
Michael Scheper
1
@ Michael Para ser justo, esta convenção já foi usada por Mantis, Trac, Redmine e provavelmente outros. Suponho que o GitHub tenha decidido segui-lo em vez de reinventar a roda. Veja stackoverflow.com/questions/40495/…
kelvin

Respostas:

235

Esse comportamento faz parte do comportamento git commitpadrão de 'limpeza'. Se você deseja manter as linhas iniciadas, #pode usar um modo de limpeza alternativo.

Por exemplo

git commit --cleanup=whitespace

Se você fizer isso, precisará tomar cuidado para remover todas as #linhas que não deseja que apareçam no commit.

CB Bailey
fonte
A próxima pergunta é: Onde posso editar os comentários da mensagem de confirmação que o git introduz, que começa por padrão com um #?
21412 Alex
2
@ Alex: É controlado pela commit.templatevariável de configuração git.
CB Bailey
23
Isso funciona muito bem também para alterar confirmações existentes. Por exemplo:git commit --amend --cleanup=whitespace
James Andres
@CharlesBailey: Eu estava esperando para se livrar do texto predefinido com git commit -t / dev / null, mas ainda está mostrando que
Alex
Como você pode ter uma mensagem de confirmação "# 123 Commit message", além de comentários em clientes como GitHub for Mac e SourceTree, acho que é isso que esses clientes estão fazendo sim?
Phil Ostler
134

Observe que, desde git1.8.2 (fevereiro de 2013) , você pode usar um caractere diferente de ' #' para a linha comentada na mensagem de confirmação.

Isso permite que você use ' #' para sua referência de número de bug.

Várias linhas de "dica" que o Git fornece quando solicita que o usuário edite as mensagens no editor são comentadas com ' #' por padrão.

A core.commentCharvariável de configuração pode ser usada para personalizar isso ' #' para um caractere diferente.


Em teoria, você pode colocar uma core.commentCharpalavra (vários caracteres), mas o git 2.0.x / 2.1 será mais rigoroso (terceiro trimestre de 2014).

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

config: seja rigoroso no core.commentChar

Não suportamos sequências de comentários (pelo menos ainda não). E a codificação de caracteres de bytes múltiplos também pode ser mal interpretada.

O teste com duas vírgulas é atualizado porque viola isso. Ele foi adicionado ao patch introduzido core.commentCharno eff80a9 (Permitir "comentário personalizado" - 2013-01-16). Não está claro para mim por que esse comportamento é desejado.


O git 2.0.x / 2.1 (terceiro trimestre de 2014) adicionará uma seleção automática para core.commentChar:
Consulte commit 84c9dc2

Quando core.commentCharé " auto", o caractere de comentário começa com ' #' como padrão, mas se já estiver na mensagem preparada, encontre outro caractere em um pequeno subconjunto. Isso deve impedir surpresas, porque o git retira algumas linhas inesperadamente.

Observe que o git não é inteligente o suficiente para reconhecer ' #' como o caractere de comentário em modelos personalizados e convertê-lo se o caractere de comentário final for diferente.
Ele considera '#' linhas em modelos personalizados como parte da mensagem de confirmação. Portanto, não use isso com modelos personalizados.

A lista de caracteres candidatos para "auto" é:

# ; @ ! $ % ^ & | :

Isso significa que um comando como git commit -m '#1 fixed issue'alternará automaticamente o commentChar para ' ;', porque ' #' foi usado na mensagem de confirmação.

VonC
fonte
1
Para corrigir HL sintaxe após isso, consulte esta questão relacionada: stackoverflow.com/questions/16164624/...
Alois Mahdal
@ Guten True, reformulei a resposta para refletir isso.
VonC 30/01
1
@newbyca com qual versão do git você vê que não é suportada durante um rebase interativo?
VonC 14/07
2
Portanto, para definir isso, você pode fazer, por exemplo:$ git config --global core.commentchar ';'
davetapley
6
Eu amo essa resposta. Oneliner para a nova solução sugerida:git config --global core.commentChar auto
aross
81

As respostas aqui são boas e detalhadas, mas para um git noob como eu, personalizar as opções de configuração do git não é tão óbvio. Aqui está um exemplo para mudar de #para ;de caracteres de comentário:

git config core.commentChar ";"

É tudo o que você precisa fazer.

Matthieu Napoli
fonte
3
Isso também altera o texto comentado padrão que o git adiciona a uma mensagem de confirmação quando se usa git commitpara abrir o editor configurado para editar uma mensagem de confirmação!
Michael Trouw
1
Para correções pontuais, use o seguinte: git -c core.commentChar="|" commit --amend(substitua |pelo que você quiser).
Droogans 20/03
62

Você pode usar a opção de linha de comando -m:

git commit -m "#123 fixed"
Olivier Verdier
fonte
35
Mas esta é uma mensagem de confirmação horrível. certifique-se de incluir o que o bug foi e como foi fixado
Boa Pessoa
3
as mensagens de confirmação estão ok, desde que haja um número de bugs
Trident D'Gao
6
Não se o sistema de rastreamento de erros for corrompido repentinamente e você não tiver um backup! :)
caveman_dick
38

Se você estiver fazendo um rebase interativo, quando você salvar sua mensagem de confirmação sem nada (porque #o início fez um comentário e, portanto, foi ignorado), o git mostrará o que você deve fazer:

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

Então, basta alterar a mensagem:

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

e continue a rebase:

git rebase --continue
Owain Williams
fonte
Isso está correto para alguém que já enviou o commit, mas deseja alterar a mensagem
Hoang Trinh
Também se aplica a novas confirmações se você inserir uma mensagem usando seu editor e ela tiver um hash no início.
Owain Williams
29

git commit --cleanup=scissorsdeve ser usado. Foi adicionado ao Git v2.0.0 em 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
fonte
Não entendo como isso é melhor do que usar commit.cleanup = whitespacee remover # …comentários manualmente, como o @CharlesBailey já sugeriu. scissors-mode limpa adicionalmente a sintaxe da tesoura usada por git format-patch/ mailinfo/ am; ele não usa a …-- >8 --…sintaxe ao adicionar comentários para confirmar as mensagens .
Slipp D. Thompson
1. Eu acho que é melhor porque eu não preciso "remover # ...comentários com muita força. 2. Eu não tenho tanta certeza sobre a segunda parte do seu comentário, o scissorsmodo está definitivamente no git commit --help. Qual versão gitvocê está usando? @ SlippD.Thompson
Sungam
Hã? whitespaceO modo oferece remoção de 1. linhas vazias iniciais e finais, 2. espaços em branco finais, 3. recolhimento de linhas vazias consecutivas. scissorsoferece remoção de 1. linhas vazias iniciais e finais, 2. espaços em branco finais, 3. recolhimento de linhas vazias consecutivas, 4. tudo (incluindo) a linha # -…- >8 -…-. No entanto, as linhas de tesoura ( # -…- >8 -…-) são inseridas apenas ao usar git-format-patch/ mailinfo/ am. Portanto, para um fluxo de trabalho normal git-commit/ merge/ rebase/ cherry-pick, o scissorsmodo de remoção oferece zero benefício sobre o whitespacemodo. v2.11.0
D. Thompson
@ SlippD.Thompson Qual versão do git você está usando? Eu estou usando 2.8.3 e git commit --cleanup=scissors DOES preceder a # ------------------------ >8 ------------------------linha antes da git statusinfo. Como abaixo: `# ------------------------> 8 ------------------- ----- # Não toque na linha acima. # Tudo abaixo será removido. # No mestre ramo # # Initial comprometer # # Alterações a ser cometidos: # novo arquivo: .gitignore `
Sungam
1
Acredito que cheguei ao fundo disso. O Git de fato insere o # ------------------------ >8 ------------------------antes do status txt “Parece que você pode estar ...” _ ao usar scissors; no entanto, ele insere a linha da tesoura após o # Conflicts: …texto. Eu tinha commit.status = falsecolocado no meu .gitconfig, então não estava vendo nenhum texto de status, apenas o texto dos conflitos. Eu estou corrigido; mudando para voto positivo.
precisa saber é o seguinte
3

Use um prefixo diferente para o número do ticket. Ou acrescente uma palavra ao número do ticket, como "Bug # 42". Ou acrescente um caractere de espaço único à linha; se você deseja remover esse espaço em branco, pode adicionar um gancho de confirmação para isso.

Pessoalmente, eu preferiria não ter esse tipo de manipulação de mensagem de confirmação feita por um gancho, porque pode ser muito irritante quando acionada quando você não deseja. A solução mais fácil é provavelmente repensar o problema.

wilhelmtell
fonte
1
palavras diferentes são apenas uma solução alternativa para o problema. se as diretrizes do projeto declararem que uma mensagem de confirmação deve começar com o ID do ticket, ela não funcionará. e um gancho pós-confirmação é muito feio. eu acho que deveria informar que esta "bug" ao desenvolvedores git
knittl
Não se preocupe, isso seria errado. Não peça aos desenvolvedores do git que trabalhem de acordo com suas diretrizes. Você não pediria a Dennis Ritchie para alterar o idioma C, para que ele suporte a convenção de nomes de variáveis ​​para começar com um caractere de hash, certo? O mesmo se aplica aqui. Se as mensagens de confirmação permitirem comentários, isso adiciona suporte a coisas interessantes, como abrir o editor de confirmação com o diff adicionado e comentado, para que você não precise se lembrar de suas mudanças exatas. O que há de errado em preservar o personagem principal do espaço?
Wilhelmtell
1
suporte caracteres de escape em de git commit mensagem não seria um negócio tão grande
knittl
5
É uma solicitação de recurso perfeitamente razoável. Especialmente devido ao fato de que Trac, AFAICT, não associa uma confirmação a uma falha de bug se a mensagem de confirmação não começar com o número da falha, começando com um hash. Portanto, não são apenas os padrões de alguém, é a sintaxe necessária de uma ferramenta. Deixe os desenvolvedores do Git decidirem se vale a pena ou não. (E sim, Trac poderia também resolver o problema Não há nada de errado com solicitando que Git fazer o que pode, também..)
Lucas Maurer
"Especialmente devido ao fato de que Trac, AFAICT, não associa uma confirmação a um erro, se a mensagem de confirmação não começar com o número do aviso, começando com um hash." - na minha experiência limitada com o Trac, algo como #xxxocorrer em qualquer lugar na mensagem de confirmação será vinculado ao problema. Não precisa estar no início do commit. Talvez isso tenha mudado nos últimos cinco anos?
Guildenstern
1

Todos os meus commits começam com, #issueNumberentão eu coloquei este boilerplate no meu vim .git/hooks/commit-msg:

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

Então, vamos supor que temos branch #15e fazemos a mensagem de confirmação add new awesome feature. Com essa abordagem, a mensagem final de confirmação será #15 add new awesome feature.

valignatev
fonte