Aggiungi l'interruzione di riga a 'git commit -m' dalla riga di comando


746

Sto usando Git dalla riga di comando e sto cercando di aggiungere un'interruzione di linea al messaggio di commit (usando git commit -m "") senza entrare in Vim.

È possibile?


6
Come nota, ecco un link che riassume le buone convenzioni sui messaggi di commit - github.com/erlang/otp/wiki/Writing-good-commit-messages se aiuta qualcuno.
WeirdElfB0y

5
Qualcosa del genere GIT_EDITOR="emacs" git commit -m 'paragraph1' -m 'paragraph2' -eti aiuterebbe ad evitare vim.
jotik,

Risposte:


694

Certamente, come è fatto dipende dalla tua shell. In Bash, puoi usare le virgolette singole intorno al messaggio e puoi semplicemente lasciare la citazione aperta, il che farà sì che Bash richieda un'altra riga, fino a quando non chiudi la citazione. Come questo:

git commit -m 'Message

goes
here'

In alternativa, puoi utilizzare un "documento qui" (noto anche come eredità):

git commit -F- <<EOF
Message

goes
here
EOF

53
La risposta di @Peter Farmer in seguito menziona che la convenzione Git è apparentemente qualcosa di simile: 1 riga per riepilogo, due interruzioni di riga, quindi un messaggio dettagliato.
Nick Spacek,

4
Inoltre, vedi sotto post di @esse. Un semplice ritorno a capo fa il trucco.
Hakan Ensari,

6
@MohamadAli, su Windows, l'analisi della riga di comando funziona in modo diverso
Simon Richter,

2
@KelvinShadewing, sì, ma con la differenza che al messaggio si applicano le regole di sostituzione della shell, quindi è necessario sfuggire ai simboli del dollaro e ad altri metacaratteri. D'altra parte ti permette di usare le variabili.
Simon Richter,

2
@Nikhil, molti programmi supportano un singolo trattino come nome file per indicare stdin o stdout. Con il documento qui , il gitcomando può leggere il testo del messaggio da stdin e l' -Fopzione fornisce il nome del file da cui leggere il messaggio.
Simon Richter,

515

Se vuoi, per esempio, un titolo e una linea di contenuti, puoi usare:

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

Nota che questo crea paragrafi separati, non linee. Quindi ci sarà una linea vuota tra ogni due -mlinee, ad esempio:

My head line

My content line.

80
Questo ha il vantaggio di lavorare su Windows in cui i trucchi citati altrove non funzionano. Separato -mper ogni riga. Bello!
ddotsenko,

8
I messaggi creati con questo metodo vengono visualizzati correttamente su GitHub, GitHub per Windows e TortoiseGit.
Richard,

12
@ddotsenko questo è il vantaggio di lavorare su Linux / Mac, dove abbiamo una shell decente =)
Ciro Santilli 28 冠状 病 六四 事件 法轮功

7
Da man git commit: -m <msg>, --message = <msg> Usa il <msg> indicato come messaggio di commit. Se vengono fornite più opzioni -m, i loro valori vengono concatenati come paragrafi separati.
Amedee Van Gasse,

55
Nota che questo crea paragrafi separati , non linee. Quindi ci sarà una linea vuota tra ogni due -mlinee.
Ohad Schneider,

398

Usando Git dalla riga di comando con Bash puoi fare quanto segue:

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

Basta digitare e premere Enterquando si desidera una nuova riga, il simbolo ">" significa che è stato premuto Entere c'è una nuova riga. Anche altre risposte funzionano.


6
La risposta di Abizern mi ha chiarito il motivo per cui funziona: la shell Bash interpreta un tasto <kbd> Invio </kbd> come una nuova riga fino a quando il primo carattere tra virgolette viene 'chiuso' (con un successivo carattere tra virgolette doppie).
Kenny Evitt,

1
Sono d'accordo che questa è una soluzione molto più efficace, più semplice e pratica della risposta accettata. Funziona bene con me usando Git 1.8.2.1. +1 da me.
crmpicco,

Questa non è una funzione speciale del tasto Invio , ma piuttosto correlata alle virgolette. Non importa se usi virgolette doppie o singole, fatta eccezione per l'espansione variabile e la fuga di caratteri speciali: ecco perché ho scelto virgolette singole nella mia risposta.
Simon Richter,

2
Non usarlo in zsh! Il terminale si chiuderà e perderai ciò che hai digitato.
laike9m,

3
Funziona in Gitbash per Windows.
Omar Tariq,

111

Dovresti essere in grado di usare

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

Dal manuale di Bash :

Le parole del modulo $ ' stringa ' sono trattate in modo speciale. La parola si espande in stringa , con i caratteri con escape backslash sostituiti come specificato dallo standard ANSI C.

Ciò include il supporto per newline come mostrato sopra, oltre a codici esadecimali e Unicode e altri. Vai alla sezione collegata per visualizzare un elenco dei caratteri con escape backslash.


@rsy: quale versione di Bash stai usando? Cosa vedi quando lo fai echo $'one\ntwo'?
In pausa fino a nuovo avviso.

1
rsy $ bash --version GNU bash, versione 3.2.53 (1) -release (x86_64-apple-darwin13) Copyright (C) 2007 Free Software Foundation, Inc. L'output di quel comando è, come previsto, mostrato in due differenti Linee!
ccoutinho,

per me su Windows 7 è l'opzione migliore Grazie
Mohamad Ali,

2
Il $ è la chiave qui e non me ne sono accorto a prima vista. Altrimenti ricevo solo un \ n nel mezzo del mio messaggio.
ChrisBob,

1
Non devi nemmeno usare $ '...' per l'intera stringa; utilizzando questo appena dietro il carattere di nuova riga funzionerà: git commit -m "first line"$'\n'"second line". Nota solo che devi chiudere la stringa precedente prima di iniziare la tua $'string'.
PlasmaBinturong,

95

Aggiunta di interruzioni di riga al commit Git

Provare quanto segue per creare un messaggio di commit multilinea:

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."

Quindi verifica cosa hai fatto:

git log -1

Dovresti finire con qualcosa del genere:

Messaggio di commit Git multilinea in PowerShell

Lo screenshot è da un esempio che ho configurato usando PowerShell con Poshgit.


7
Risposta fantastica. Ho cercato questo per anni e ho provato numerosi modi diversi per formattare i miei messaggi di commit Git, ma questo funziona al meglio. Posso confermare che funziona al prompt con Git 1.8.2.1.
crmpicco,

1
In Powershell puoi fare `n per l'interruzione di linea
Ecropolis,

2
Ha funzionato molto per me in Git Bash per Windows .
Ulisse Alves,

1
Questa dovrebbe essere la risposta scelta in quanto è il metodo più compatibile, non si basa su alcun prompt CLI specifico come fanno altri suggerimenti.

1
Questa è una risposta migliore e dovrebbe essere selezionata come risposta. Non solo questo si allinea come comportamento predefinito e fornisce un messaggio di commit molto più pulito, ma è anche un po 'più flessibile con più -m. Anche se sembra specifico di Windows e ha attirato commenti relativi a Windows, funziona bene anche in Linux.
0xc0de

44

Fare qualcosa del genere

git commit -m"test\ntest"

non funziona, ma qualcosa del genere

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

funziona, ma non è molto carino. Hai impostato un git-commitlbcomando nel tuo PATHche fa qualcosa del genere:

#!/bin/bash

message=$1

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

E usalo in questo modo:

git commitlb "line1\nline2\nline3"

Avvertenza, ho la sensazione che la convenzione generale debba avere una riga di riepilogo come prima riga, quindi due interruzioni di riga e quindi un messaggio esteso nel messaggio di commit, quindi fare qualcosa del genere interromperebbe tale convenzione. Ovviamente potresti fare:

git commitlb "line1\n\nline2\nline3"

8
+1 è stata quella convention generale che mi ha fatto guardare in questa direzione. Grazie
Alan Whitelaw,

39

Dalla documentazione Git :

-m <msg>
--message = <msg>
Usa il <msg> indicato come messaggio di commit. Se -mvengono fornite più opzioni, i loro valori vengono concatenati come paragrafi separati.

Quindi, se stai cercando di raggruppare più messaggi di commit, questo dovrebbe funzionare:

git commit -m "commit message1" -m "commit message2"

Soluzione agnostica (indipendente dalla shell). Grazie per questo. Dobbiamo RTFM :)
Mat M


28

Non è necessario complicare le cose. Dopo la -m "text...riga successiva si ottiene premendo Enter. Quando Enterviene premuto >appare. Al termine, basta inserire "e premere 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 ...

1
Questa risposta non sta ottenendo abbastanza amore!
cBlaine,

1
Questa è un'ottima risposta, le nuove linee sono mostrate correttamente su Github. La prima riga mostra un'intestazione.
Yogesh Umesh Vaity,

18

Uso zsh su un Mac e posso pubblicare messaggi di commit su più righe tra virgolette doppie ("). Fondamentalmente continuo a digitare e premere Invio per nuove righe, ma il messaggio non viene inviato a Git fino a quando non chiudo le virgolette e restituisco .


7
Puoi fare lo stesso in bash.
Peter Farmer,

17

In Bash / Zsh puoi semplicemente usare le interruzioni di riga letterali all'interno delle virgolette:

git commit -m 'Multi-line
commit
message'

La quotazione ANSI-C funziona anche in Bash / Zsh:

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

Puoi anche indicare a Git di utilizzare un editor a tua scelta per modificare il messaggio di commit. Dai documenti su git-commit :

L'editor utilizzato per modificare il messaggio del registro di commit verrà scelto dalla GIT_EDITORvariabile di ambiente, dalla core.editorvariabile di configurazione, dalla VISUALvariabile di ambiente o dalla EDITOR variabile di ambiente (in quell'ordine). Vedi git-var per i dettagli.


5

Personalmente, trovo più semplice modificare i messaggi di commit dopo il fatto vi(o qualunque sia il tuo editor git preferito) piuttosto che sulla riga di comando, facendo git commit --amendsubito dopo git commit.


6
Puoi ottenere lo stesso risultato senza doverlo modificare semplicemente usando git commit -e.
Nathan Hinchey,

4
O semplicemente git commit, e aprirà un editor con un modello di messaggio di commit.
Jim Stewart,

5

Se stai usando Bash, premi C-x C-e( Ctrl+ x Ctrl+ e) e si aprirà il comando corrente nel tuo editor preferito.

È possibile modificare l'editor preferito modificando VISUALe EDITOR.

Questo è quello che ho nel mio .bashrc:

export ALTERNATE_EDITOR=''
export EDITOR='emacsclient -t'
export VISUAL='emacsclient -c'
export SUDO_EDITOR='emacsclient -t'

1
Allora perché qualcuno ha votato in negativo? Questo è il modo più conveniente per lavorare con i comandi multilinea in bash, devi solo configurarlo subito. Ho usato altri stupidi suggerimenti mostrati in altre risposte qui, ma una volta che hai imparato a modificare i tuoi comandi nel tuo editor di testo preferito non c'è più modo di tornare indietro.
Aleks-Daniel Jakimenko-A.

1
Questo è così straziantemente utile che non riesco proprio a credere di aver vissuto i miei anni passati senza questo.
Presto, il

2

Ecco un elenco di soluzioni non riuscite su Windows con shell cmd.exe standard (per risparmiare tempo di prova ed errore!):

  • git commit -m 'Hello Enter non funziona: non richiederà una nuova linea

  • git commit -m "Hello Enter idem

  • git commit -m "Hello^ Enter idem

  • git commit -m 'Hello^ Enter World'sembra funzionare perché chiede "Altro?" e permette di scrivere una nuova riga, ma alla fine quando lo fai git logvedrai che è ancora un messaggio di una riga ...

TL; DR: Anche se su Windows, l'analisi della riga di comando funziona in modo diverso e ^consente input multilinea, non aiuta qui.

Finalmente git commit -eè probabilmente l'opzione migliore.


Basta non usare quella scusa triste per le offerte di una "shell" di Windows.
jthill,

2

Purtroppo, git non sembra consentire alcun carattere di nuova riga nel suo messaggio. Esistono già diverse soluzioni ragionevoli sopra, ma durante lo scripting sono fastidiose. Anche qui i documenti funzionano, ma potrebbero anche essere un po 'troppo fastidiosi da gestire (pensa ai file yaml)

Ecco cosa ho fatto:

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

Anche se questo è ancora brutto, consente "one-liner" che possono essere ancora utili. Poiché di solito le stringhe sono variabili o combinate con variabili, le bruttezze possono essere ridotte al minimo.


1

Non vedo nessuno menzionare che se non fornisci un messaggio si aprirà nano per te (almeno in Linux) dove puoi scrivere più righe ...

Era necessario solo questo:

git commit
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.