Ajouter un saut de ligne à «git commit -m» à partir de la ligne de commande

746

J'utilise Git à partir de la ligne de commande et j'essaye d'ajouter un saut de ligne au message de validation (en utilisant git commit -m "" ) sans entrer dans Vim.

Est-ce possible?

Alan Whitelaw
la source
6
Comme note, voici un lien qui résume les bonnes conventions de message de validation - github.com/erlang/otp/wiki/Writing-good-commit-messages si cela aide quelqu'un.
WeirdElfB0y
5
Quelque chose comme GIT_EDITOR="emacs" git commit -m 'paragraph1' -m 'paragraph2' -eça vous aiderait à éviter vim.
jotik

Réponses:

694

Certes, la façon dont cela se fait dépend de votre shell. Dans Bash, vous pouvez utiliser des guillemets simples autour du message et laisser simplement le devis ouvert, ce qui fera inviter Bash pour une autre ligne, jusqu'à ce que vous fermiez le devis. Comme ça:

git commit -m 'Message

goes
here'

Alternativement, vous pouvez utiliser un "document ici" (également appelé heredoc):

git commit -F- <<EOF
Message

goes
here
EOF
Simon Richter
la source
53
La réponse de @Peter Farmer plus tard mentionne que la convention Git est apparemment quelque chose comme: 1 ligne pour le résumé, deux sauts de ligne, puis un message détaillé.
Nick Spacek du
4
Voir également le post ci-dessous par @esse. Un simple retour chariot fait l'affaire.
Hakan Ensari
6
@MohamadAli, sur Windows, l'analyse en ligne de commande fonctionne différemment
Simon Richter
2
@KelvinShadewing, oui, mais avec la différence que les règles de substitution de shell s'appliquent au message, vous devez donc échapper aux signes dollar et autres métacaractères. D'autre part, il vous permet d'utiliser des variables.
Simon Richter
2
@Nikhil, de nombreux programmes prennent en charge un seul tiret comme nom de fichier pour signifier stdin ou stdout. Avec le document ici , la gitcommande peut lire le texte du message depuis stdin et l' -Foption donne le nom du fichier à partir duquel lire le message.
Simon Richter
515

Si vous voulez juste, disons, un titre et une ligne de contenu, vous pouvez utiliser:

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

Notez que cela crée des paragraphes séparés - pas des lignes. Il y aura donc une ligne vierge entre chacun des deux-m lignes, par exemple:

My head line

My content line.
Simon
la source
80
Cela a l'avantage de travailler sur Windows où les astuces citées ailleurs ne fonctionnent pas. Séparez -mpour chaque ligne. Agréable!
ddotsenko
8
Les messages créés à l'aide de cette méthode s'affichent correctement sur GitHub, GitHub pour Windows et TortoiseGit.
Richard
12
@ddotsenko c'est l'avantage de travailler sur Linux / Mac, où nous avons un shell décent =)
Ciro Santilli 郝海东 冠状 病 六四 事件 法轮功
7
De man git commit: -m <msg>, --message = <msg> Utilisez le <msg> donné comme message de validation. Si plusieurs options -m sont données, leurs valeurs sont concaténées sous forme de paragraphes séparés.
Amedee Van Gasse
55
Notez que cela crée des paragraphes séparés - pas des lignes. Il y aura donc une ligne vierge entre chacune des deux -mlignes.
Ohad Schneider
398

En utilisant Git depuis la ligne de commande avec Bash, vous pouvez effectuer les opérations suivantes:

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

Tapez et appuyez simplement sur Enterlorsque vous voulez une nouvelle ligne, le symbole ">" signifie que vous avez appuyé Enteret il y a une nouvelle ligne. D'autres réponses fonctionnent également.

esse
la source
6
La réponse d'Abizern a clarifié pour moi pourquoi cela fonctionne - le shell Bash interprète une pression de touche <kbd> Entrée </kbd> comme une nouvelle ligne jusqu'à ce que le premier caractère entre guillemets doubles soit `` fermé '' (avec un caractère entre guillemets suivant).
Kenny Evitt
1
Je dois convenir qu'il s'agit d'une solution beaucoup plus efficace, plus simple et plus pratique que la réponse acceptée. Cela fonctionne bien pour moi en utilisant Git 1.8.2.1. +1 de moi.
crmpicco
Ce n'est pas une fonction spéciale de la touche Entrée , mais plutôt liée aux guillemets. Que vous utilisiez des guillemets doubles ou simples n'a pas vraiment d'importance, sauf pour l'expansion variable et les caractères spéciaux d'échappement - c'est pourquoi j'ai choisi des guillemets simples dans ma réponse.
Simon Richter
2
Ne l'utilisez pas dans zsh! Le terminal se fermera et vous perdrez ce que vous avez tapé.
laike9m
3
Fonctionne dans Gitbash pour Windows.
Omar Tariq
111

Vous devriez pouvoir utiliser

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

Du manuel Bash :

Les mots de la forme $ ' string ' sont traités spécialement. Le mot se développe en chaîne , avec des caractères d'échappement antislash remplacés comme spécifié par la norme C ANSI.

Cela inclut la prise en charge des sauts de ligne comme indiqué ci-dessus, ainsi que les codes hexadécimaux et Unicode et autres. Accédez à la section liée pour voir une liste des caractères d'échappement avec barre oblique inverse.

En pause jusqu'à nouvel ordre.
la source
@rsy: Quelle version de Bash utilisez-vous? Que voyez-vous quand vous le faites echo $'one\ntwo'?
pause jusqu'à nouvel ordre.
1
rsy $ bash --version GNU bash, version 3.2.53 (1) -release (x86_64-apple-darwin13) Copyright (C) 2007 Free Software Foundation, Inc. La sortie de cette commande est, comme prévu, affichée dans deux différents lignes!
ccoutinho
pour moi sur windows 7 c'est la meilleure option Merci
Mohamad Ali
2
Le $ est la clé ici et je ne l'ai pas remarqué à première vue. Sinon, je reçois juste un \ n au milieu de mon message.
ChrisBob
1
Vous n'avez même pas besoin d'utiliser $ '...' pour toute la chaîne; en utilisant ce juste autour du caractère de nouvelle ligne fonctionnera: git commit -m "first line"$'\n'"second line". Notez simplement que vous devez fermer la chaîne précédente avant de commencer votre $'string'.
PlasmaBinturong
95

Ajouter des sauts de ligne à votre commit Git

Essayez ce qui suit pour créer un message de validation sur plusieurs lignes:

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

Vérifiez ensuite ce que vous avez fait:

git log -1

Vous devriez vous retrouver avec quelque chose comme ceci:

Message de validation Git multiligne dans PowerShell

La capture d'écran provient d'un exemple que j'ai configuré à l'aide de PowerShell avec Poshgit.

Jon Crowell
la source
7
Réponse géniale. J'ai cherché cela depuis des siècles et j'ai essayé de nombreuses façons de formater mes messages de validation Git, mais cela fonctionne le mieux. Je peux confirmer que cela fonctionne à l'invite avec Git 1.8.2.1.
crmpicco
1
Dans Powershell, vous pouvez faire `n pour la rupture de ligne
Ecropolis
2
Cela a beaucoup fonctionné pour moi dans Git Bash pour Windows .
Ulysses Alves
1
Cela devrait être la réponse choisie car c'est la méthode la plus compatible, cela ne dépend d'aucune invite CLI spécifique comme le font d'autres suggestions.
1
Il s'agit d'une meilleure réponse et doit être sélectionnée comme réponse. Non seulement cela va comme un comportement par défaut et fournit un message de validation beaucoup plus propre, mais il est également un peu plus flexible avec plusieurs -m. De plus, même s'il semble spécifique à Windows et a attiré des commentaires liés à Windows, cela fonctionne aussi bien sous Linux.
0xc0de
44

Faire quelque chose comme

git commit -m"test\ntest"

ne fonctionne pas, mais quelque chose comme

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

fonctionne, mais ce n'est pas très joli. Vous configurez une git-commitlbcommande dans votre PATHqui fait quelque chose comme ceci:

#!/bin/bash

message=$1

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

Et utilisez-le comme ceci:

git commitlb "line1\nline2\nline3"

Un mot d'avertissement, j'ai l'impression que la convention générale est d'avoir une ligne récapitulative comme première ligne, puis deux sauts de ligne, puis un message étendu dans le message de validation, donc faire quelque chose comme ça briserait cette convention. Vous pourriez bien sûr faire:

git commitlb "line1\n\nline2\nline3"
Peter Farmer
la source
8
+1 c'est cette convention générale qui m'a fait regarder dans cette direction. Merci
Alan Whitelaw
39

De la documentation Git :

-m <msg>
--message = <msg>
Utilisez le <msg> donné comme message de validation. Si plusieurs -moptions sont données, leurs valeurs sont concaténées en paragraphes séparés.

Donc, si vous cherchez à regrouper plusieurs messages de validation, cela devrait faire le travail:

git commit -m "commit message1" -m "commit message2"
Saravanan M
la source
Solution agnostique (indépendante de la coque). Merci pour cela. Nous devons RTFM :)
Mat M
38

J'espère que cela ne mène pas trop loin de la question publiée, mais en définissant l'éditeur par défaut , puis en utilisant

git commit -e

pourrait être beaucoup plus confortable.

Tobse
la source
2
Celui-ci devrait être la meilleure réponse.
hxpax
5
vous pouvez laisser de côté le -eet il ouvrira toujours l'éditeur
djangonaut
Celui-ci était la réponse que je cherchais.
Tinmarino
28

Il n'y a pas besoin de compliquer les choses. Après la -m "text...ligne suivante est obtenue en appuyant sur Enter. Lorsque Enterest enfoncé >apparaît. Lorsque vous avez terminé, il vous suffit de mettre "et d'appuyer sur 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
la source
1
Cette réponse ne reçoit pas assez d'amour!
cBlaine
1
C'est une excellente réponse, les nouvelles lignes sont affichées correctement sur Github. La première ligne apparaît comme un en-tête.
Yogesh Umesh Vaity
18

J'utilise zsh sur un Mac et je peux poster des messages de validation sur plusieurs lignes entre guillemets ("). En gros, je continue à taper et à appuyer sur Entrée pour les nouvelles lignes, mais le message n'est envoyé à Git que lorsque je ferme les guillemets et que je reviens .

Abizern
la source
7
Vous pouvez faire de même en bash.
Peter Farmer
17

Dans Bash / Zsh, vous pouvez simplement utiliser des sauts de ligne littéraux entre guillemets:

git commit -m 'Multi-line
commit
message'

La cotation ANSI-C fonctionne également en Bash / Zsh:

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

Vous pouvez également demander à Git d'utiliser un éditeur de votre choix pour modifier le message de validation. Depuis les documents sur git-commit :

L'éditeur utilisé pour modifier le message du journal de validation sera choisi dans la GIT_EDITORvariable d'environnement, lecore.editor variable de configuration, la VISUALvariable d'environnement ou la EDITOR variable d'environnement (dans cet ordre). Voir git-var pour plus de détails.

Eugene Yarmash
la source
5

Personnellement, je trouve plus facile de modifier les messages de commit après coup dans vi(ou quel que soit l'éditeur de git de votre choix) plutôt que sur la ligne de commande, en faisant git commit --amendjuste après git commit.

amphibient
la source
6
Vous pouvez obtenir ce même résultat sans avoir à modifier en utilisant simplement git commit -e.
Nathan Hinchey
4
Ou tout simplement git commit, et il ouvrira un éditeur avec un modèle de message de validation.
Jim Stewart
5

Si vous utilisez Bash, appuyez sur C-x C-e( Ctrl+ x Ctrl+e ), et cela ouvrira la commande actuelle dans votre éditeur préféré.

Vous pouvez modifier l'éditeur préféré en peaufinant VISUALetEDITOR .

Voilà ce que j'ai dans mon .bashrc:

export ALTERNATE_EDITOR=''
export EDITOR='emacsclient -t'
export VISUAL='emacsclient -c'
export SUDO_EDITOR='emacsclient -t'
Aleks-Daniel Jakimenko-A.
la source
1
Alors, pourquoi quelqu'un a-t-il voté contre? C'est le moyen le plus pratique de travailler avec des commandes multilignes dans bash, il vous suffit de le configurer une seule fois. J'ai utilisé d'autres suggestions stupides présentées dans d'autres réponses ici, mais une fois que vous avez appris à modifier vos commandes dans votre éditeur de texte préféré, il n'y a tout simplement plus de retour.
Aleks-Daniel Jakimenko-A.
1
C'est tellement déchirant que je n'arrive pas à croire que j'ai vécu mes dernières années sans ça.
BientôtDead
2

Voici une liste des solutions défaillantes sous Windows avec le shell cmd.exe standard (pour vous faire gagner du temps d'essai et d'erreur!):

  • git commit -m 'Hello Enter ne fonctionne pas: il ne demandera pas de nouvelle ligne

  • git commit -m "Hello Enter idem

  • git commit -m "Hello^ Enter idem

  • git commit -m 'Hello^ Enter World'ressemble à travailler car il demande "Plus?" et permet d'écrire une nouvelle ligne, mais finalement en le faisant git logvous verrez que c'est toujours un message d'une ligne ...

TL; DR: Même si sous Windows, l'analyse syntaxique en ligne de commande fonctionne différemment et ^permet une entrée multiligne, cela n'aide pas ici.

Enfin, git commit -ec'est probablement la meilleure option.

Basj
la source
N'utilisez simplement pas cette triste, triste excuse pour une fenêtre "shell".
2018
2

Malheureusement, git ne semble pas autoriser de caractère de nouvelle ligne dans son message. Il existe différentes solutions raisonnables déjà ci-dessus, mais lors de l'écriture de scripts, celles-ci sont ennuyeuses. Ici, les documents fonctionnent également, mais peuvent également être un peu trop ennuyeux à traiter (pensez aux fichiers yaml)

Voici ce que j'ai fait:

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

Bien que cela soit toujours aussi moche, cela permet des 'one-liners' qui peuvent encore être utiles. Comme les chaînes sont généralement des variables ou combinées avec des variables, les laideurs peuvent être réduites au minimum.

Oliver
la source
1

Je ne vois personne mentionner que si vous ne fournissez pas de message, il ouvrira nano pour vous (au moins sous Linux) où vous pouvez écrire plusieurs lignes ...

Seulement cela était nécessaire:

git commit
Rodrigo Graça
la source