Adicione quebra de linha ao 'git commit -m' na linha de comando

746

Estou usando o Git na linha de comando e estou tentando adicionar uma quebra de linha à mensagem de confirmação (usando git commit -m "") sem entrar no Vim.

Isso é possível?

Alan Whitelaw
fonte
6
Como observação, aqui está um link que resume as convenções de boas mensagens de confirmação - github.com/erlang/otp/wiki/Writing-good-commit-messages se isso ajudar alguém.
precisa saber é o seguinte
5
Algo como GIT_EDITOR="emacs" git commit -m 'paragraph1' -m 'paragraph2' -eajudaria a evitar vim.
jotik

Respostas:

694

Certamente, como isso é feito depende do seu shell. No Bash, você pode usar aspas simples ao redor da mensagem e apenas deixar a cotação aberta, o que fará com que o Bash solicite outra linha até que você feche a cotação. Como isso:

git commit -m 'Message

goes
here'

Como alternativa, você pode usar um "documento aqui" (também conhecido como heredoc):

git commit -F- <<EOF
Message

goes
here
EOF
Simon Richter
fonte
53
A resposta de @Peter Farmer mais tarde menciona que a convenção do Git é aparentemente algo como: 1 linha para resumo, duas quebras de linha e, em seguida, uma mensagem detalhada.
Nick Spacek 14/10
4
Além disso, veja abaixo a publicação de @esse. Um simples retorno de carro faz o truque.
Hakan Ensari
6
@MohamadAli, no Windows, análise de linha de comando funciona de forma diferente
Simon Richter
2
@KelvinShadewing, sim, mas com a diferença de que as regras de substituição de shell se aplicam à mensagem, você precisa escapar de cifrões e outros metacaracteres. Por outro lado, permite usar variáveis.
22617 Simon Simonter
2
@ Nikhil, muitos programas suportam um único traço como um nome de arquivo para significar stdin ou stdout. Com o documento aqui , o gitcomando pode ler o texto da mensagem a partir de stdin e a -Fopção fornece o nome do arquivo para leitura da mensagem.
Simon Richter
515

Se você quiser apenas, digamos, uma linha de cabeçalho e uma linha de conteúdo, você pode usar:

git commit -m "My head line" -m "My content line."

Observe que isso cria parágrafos separados - não linhas. Portanto, haverá uma linha em branco entre cada duas -mlinhas, por exemplo:

My head line

My content line.
Simon
fonte
80
Isso tem o benefício de trabalhar no Windows, onde truques de citações mencionados em outros lugares não funcionam. Separe -mpara cada linha. Agradável!
precisa
8
As mensagens criadas usando esse método são exibidas corretamente no GitHub, GitHub for Windows e TortoiseGit.
Richard
12
@ddotsenko este é o benefício de trabalhar em Linux / Mac, onde temos um shell decente =)
Ciro Santilli郝海东冠状病六四事件法轮功
7
De man git commit: -m <msg>, --message = <msg> Use o <msg> fornecido como a mensagem de confirmação. Se várias opções -m forem fornecidas, seus valores serão concatenados como parágrafos separados.
Amedee Van Gasse
55
Observe que isso cria parágrafos separados - não linhas. Portanto, haverá uma linha em branco entre cada duas -mlinhas.
Ohad Schneider
398

Usando o Git na linha de comando com o Bash, você pode fazer o seguinte:

git commit -m "this is
> a line
> with new lines
> maybe"

Basta digitar e pressionar Enterquando desejar uma nova linha, o símbolo ">" significa que você pressionou Entere há uma nova linha. Outras respostas também funcionam.

esse
fonte
6
A resposta de Abizern me esclareceu por que isso funciona - o shell Bash interpreta um pressionamento de tecla <kbd> Enter </kbd> como uma nova linha até que o primeiro caractere de aspas duplas seja 'fechado' (com um caractere de aspas duplas subsequente).
21713 Kenny Evitt
1
Devo concordar que esta é uma solução muito mais eficaz, mais fácil e prática que a resposta aceita. Funciona bem para mim usando o Git 1.8.2.1. +1 de mim.
precisa saber é
Esta não é uma função especial da tecla Enter , mas sim relacionada às aspas. Se você usa aspas duplas ou simples, não importa realmente, exceto a expansão variável e os caracteres especiais que escapam - foi por isso que escolhi aspas simples na minha resposta.
Simon Richter
2
Não use isso no zsh! O terminal será fechado e você perderá o que digitou.
laike9m
3
Funciona no Gitbash para Windows.
Omar Tariq
111

Você deve poder usar

git commit -m $'first line\nsecond line'

No manual do Bash :

Palavras da forma $ ' string ' são tratadas especialmente. A palavra se expande para cadeia , com caracteres de escape com barra invertida substituídos conforme especificado pelo padrão ANSI C.

Isso inclui suporte para novas linhas, como mostrado acima, além de códigos hexadecimais e Unicode e outros. Vá para a seção vinculada para ver uma lista dos caracteres com escape de barra invertida.

Pausado até novo aviso.
fonte
@rsy: Qual versão do Bash você está usando? O que você vê quando faz echo $'one\ntwo'?
Pausado até novo aviso.
1
rsy $ bash - versão GNU bash, versão 3.2.53 (1) -release (x86_64-apple-darwin13) Copyright (C) 2007 Free Software Foundation, Inc. A saída desse comando é, como esperado, mostrada em dois diferentes linhas!
ccoutinho
para mim no Windows 7 é a melhor opção Obrigado
Mohamad Ali
2
O $ é a chave aqui e eu não o notei à primeira vista. Caso contrário, apenas recebo um \ n no meio da minha mensagem.
22417 ChrisBob
1
Você nem precisa usar o $ '...' para toda a string; usando este apenas em torno do caractere de nova linha vai funcionar: git commit -m "first line"$'\n'"second line". Apenas observe que você precisa fechar a string anterior antes de iniciar o seu $'string'.
precisa saber é o seguinte
95

Adicionando quebras de linha ao seu commit do Git

Tente o seguinte para criar uma mensagem de confirmação de várias linhas:

git commit -m "Demonstrate multi-line commit message in Powershell" -m "Add a title to your commit after -m enclosed in quotes,
then add the body of your comment after a second -m.
Press ENTER before closing the quotes to add a line break.
Repeat as needed.
Then close the quotes and hit ENTER twice to apply the commit."

Em seguida, verifique o que você fez:

git log -1

Você deve terminar com algo assim:

Mensagem de confirmação Git de várias linhas no PowerShell

A captura de tela é de um exemplo que eu configurei usando o PowerShell com Poshgit.

Jon Crowell
fonte
7
Resposta incrível. Eu procurei por isso há séculos e tentei várias maneiras diferentes de formatar minhas mensagens de confirmação do Git, mas isso funciona melhor. Posso confirmar que funciona imediatamente com o Git 1.8.2.1.
precisa saber é o seguinte
1
Em PowerShell que você pode fazer `n de quebra de linha
Ecropolis
2
Funcionou muito para mim no Git Bash para Windows .
Ulysses Alves
1
Esta deve ser a resposta escolhida por ser o método mais compatível, isso não confiar em qualquer CLI específico prompt de como algumas outras sugestões fazer ..
1
Esta é uma resposta melhor e deve ser selecionada como a resposta. Não apenas isso está alinhado como um comportamento padrão, e fornece uma mensagem de confirmação muito mais limpa, mas também é um pouco mais flexível com vários m. Além disso, embora pareça específico do Windows e tenha atraído comentários relacionados ao Windows, ele funciona bem no Linux também.
0xc0de 9/04
44

Fazendo algo como

git commit -m"test\ntest"

não funciona, mas algo como

git commit -m"$(echo -e "test\ntest")"

funciona, mas não é muito bonito. Você configura um git-commitlbcomando no seu PATHque faz algo como isto:

#!/bin/bash

message=$1

git commit -m"$(echo -e "$message")"

E use-o assim:

git commitlb "line1\nline2\nline3"

Aviso: tenho a sensação de que a convenção geral é ter uma linha de resumo como a primeira linha e, em seguida, duas quebras de linha e, em seguida, uma mensagem estendida na mensagem de confirmação, portanto, fazer algo parecido com isso quebraria essa convenção. Você poderia, é claro, fazer:

git commitlb "line1\n\nline2\nline3"
Peter Farmer
fonte
8
+1 foi a convenção geral que me levou a olhar por esse caminho. Obrigado
Alan Whitelaw
39

Da documentação do Git :

-m <msg>
--message = <msg>
Use o <msg> fornecido como a mensagem de confirmação. Se várias -mopções forem fornecidas, seus valores serão concatenados como parágrafos separados.

Portanto, se você estiver procurando agrupar várias mensagens de confirmação, isso deve funcionar:

git commit -m "commit message1" -m "commit message2"
Saravanan M
fonte
Solução agnóstica (independente do shell). Obrigado por isso. Precisamos RTFM :)
Mat M
38

Espero que isso não esteja muito longe da pergunta postada, mas defina o editor padrão e use

git commit -e

pode ser muito mais confortável.

Tobse
fonte
2
Este deve ser o melhor respondedor.
Hxpax
5
você pode deixar fora o -ee ainda vai abrir o editor
djangonaut
Esta foi a resposta que eu estava procurando.
Tinmarino 14/09
28

Não há necessidade de complicar as coisas. Após a -m "text...próxima linha é obtida pressionando Enter. Quando Enteré pressionado >aparece. Quando terminar, basta colocar "e pressionar Enter:

$ git commit -m "Another way of demonstrating multicommit messages:
>
> This is a new line written
> This is another new line written
> This one is really awesome too and we can continue doing so till ..."

$ git log -1
commit 5474e383f2eda610be6211d8697ed1503400ee42 (HEAD -> test2)
Author: ************** <*********@gmail.com>
Date:   Mon Oct 9 13:30:26 2017 +0200

Another way of demonstrating multicommit messages:

This is a new line written
This is another new line written
This one is really awesome too and we can continue doing so till ...
blongho
fonte
1
Esta resposta não está recebendo amor suficiente!
CBlaine
1
Esta é uma ótima resposta, novas linhas são mostradas corretamente no Github. A primeira linha é exibida como um cabeçalho.
Yogesh Umesh Vaity
18

Uso o zsh em um Mac e posso postar mensagens de confirmação de várias linhas entre aspas duplas ("). Basicamente, continuo digitando e pressionando return para novas linhas, mas a mensagem não é enviada para o Git até fechar as aspas e retornar .

Abizern
fonte
7
Você pode fazer o mesmo no bash.
Peter Farmer
17

No Bash / Zsh, você pode simplesmente usar quebras de linha literais entre aspas:

git commit -m 'Multi-line
commit
message'

A cotação ANSI-C também funciona no Bash / Zsh:

git commit -m $'Multi-line\ncommit\nmessage'

Você também pode instruir o Git a usar um editor de sua escolha para editar a mensagem de confirmação. Nos documentos sobre git-commit :

O editor usado para editar a mensagem de log de confirmação será escolhido na GIT_EDITORvariável de ambiente, na core.editorvariável de configuração, na VISUALvariável de ambiente ou na EDITOR variável de ambiente (nessa ordem). Veja git-var para detalhes.

Eugene Yarmash
fonte
5

Pessoalmente, acho mais fácil modificar as mensagens de confirmação após o fato vi(ou qualquer que seja o seu editor de git de escolha), e não na linha de comando, fazendo git commit --amendlogo depois git commit.

anfíbio
fonte
6
Você pode obter esse mesmo resultado sem precisar alterar apenas usando git commit -e.
18716 Nathan Hinchey
4
Ou simplesmente git commit, e ele abrirá um editor com um modelo de mensagem de confirmação.
Jim Stewart
5

Se você estiver usando o Bash, pressione C-x C-e( Ctrl+ x Ctrl+ e) e ele abrirá o comando atual no seu editor preferido.

Você pode alterar o editor preferido ajustando VISUALe EDITOR.

É isso que tenho no meu .bashrc:

export ALTERNATE_EDITOR=''
export EDITOR='emacsclient -t'
export VISUAL='emacsclient -c'
export SUDO_EDITOR='emacsclient -t'
Aleks-Daniel Jakimenko-A.
fonte
1
Então, por que alguém negou isso? Esta é a maneira mais conveniente de trabalhar com comandos de múltiplas linhas no bash, basta configurá-lo imediatamente. Eu tenho usado outras sugestões estúpidas mostradas em outras respostas aqui, mas depois que você aprende a editar seus comandos no seu editor de texto favorito, simplesmente não há caminho de volta.
Aleks-Daniel Jakimenko-A.
1
Isso é tão dolorosamente útil que simplesmente não consigo acreditar que vivi meus últimos anos sem isso.
SoonDead
2

Aqui está uma lista de soluções com falha no Windows com o shell cmd.exe padrão (para economizar tempo de tentativa e erro!):

  • git commit -m 'Hello Enter não funciona: não pedirá uma nova linha

  • git commit -m "Hello Enter idem

  • git commit -m "Hello^ Enter idem

  • git commit -m 'Hello^ Enter World'parece trabalhar porque pede "mais?" e permite escrever uma nova linha, mas finalmente, ao fazer git logisso, você verá que ainda é uma mensagem de uma linha ...

TL; DR: Mesmo que no Windows, a análise de linha de comando funcione de maneira diferente e ^permita a entrada de várias linhas, não ajuda aqui.

Finalmente, git commit -eé provavelmente a melhor opção.

Basj
fonte
Só não use essa desculpa triste e triste para uma "concha" do Windows.
jthill
2

Infelizmente, o git não parece permitir nenhum caractere de nova linha em sua mensagem. Já existem várias soluções razoáveis ​​acima, mas quando o script é irritante. Aqui os documentos também funcionam, mas também podem ser um pouco chatos para lidar (pense em arquivos yaml)

Aqui está o que eu fiz:

git commit \
    --message "Subject" \
    --message "First line$(echo)Second line$(echo)Third Line"

Embora isso também seja feio, permite 'one-liners' que podem ser úteis ainda. Como geralmente as seqüências de caracteres são variáveis ​​ou combinadas com variáveis, os feios podem ser mantidos no mínimo.

oliver
fonte
1

Não vejo ninguém mencionando que, se você não fornecer uma mensagem, ela abrirá o nano para você (pelo menos no Linux), onde você poderá escrever várias linhas ...

Apenas isso é necessário:

git commit
Rodrigo Graça
fonte