Fügen Sie 'git commit -m' über die Befehlszeile einen Zeilenumbruch hinzu

746

Ich verwende Git über die Befehlszeile und versuche, der Festschreibungsnachricht (using git commit -m "") einen Zeilenumbruch hinzuzufügen, ohne auf Vim zuzugreifen.

Ist das möglich?

Alan Whitelaw
quelle
6
Hier ist ein Link, der gute Konventionen für Commit-Nachrichten zusammenfasst - github.com/erlang/otp/wiki/Writing-good-commit-messages, wenn es jemandem hilft.
WeirdElfB0y
5
So etwas GIT_EDITOR="emacs" git commit -m 'paragraph1' -m 'paragraph2' -ewürde dir helfen, es zu vermeiden vim.
Jotik

Antworten:

694

Wie es gemacht wird, hängt natürlich von Ihrer Shell ab. In Bash können Sie einfache Anführungszeichen um die Nachricht verwenden und das Anführungszeichen einfach offen lassen, wodurch Bash zur Eingabe einer weiteren Zeile auffordert, bis Sie das Anführungszeichen schließen. So was:

git commit -m 'Message

goes
here'

Alternativ können Sie ein "Hier-Dokument" (auch als Heredoc bezeichnet) verwenden:

git commit -F- <<EOF
Message

goes
here
EOF
Simon Richter
quelle
53
In der Antwort von @Peter Farmer wird später erwähnt, dass die Git-Konvention anscheinend so etwas wie: 1 Zeile für eine Zusammenfassung, zwei Zeilenumbrüche, dann eine detaillierte Nachricht.
Nick Spacek
4
Siehe auch den folgenden Beitrag von @esse. Ein einfacher Wagenrücklauf reicht aus.
Hakan Ensari
6
@ MohamadAli, unter Windows funktioniert das Parsen der Befehlszeile anders
Simon Richter
2
@ KelvinShadewing, ja, aber mit dem Unterschied, dass Shell-Substitutionsregeln für die Nachricht gelten, müssen Sie sich Dollarzeichen und anderen Metazeichen entziehen. Auf der anderen Seite können Sie Variablen verwenden.
Simon Richter
2
@Nikhil, viele Programme unterstützen einen einzelnen Bindestrich als Dateinamen, um stdin oder stdout zu bedeuten. Mit dem hiergit gezeigten Dokument kann der Befehl den Nachrichtentext von stdin lesen, und die -FOption gibt den Dateinamen an, aus dem die Nachricht gelesen werden soll.
Simon Richter
514

Wenn Sie beispielsweise nur eine Überschrift und eine Inhaltszeile möchten, können Sie Folgendes verwenden:

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

Beachten Sie, dass dadurch separate Absätze erstellt werden - keine Zeilen. Es wird also zwischen jeweils zwei -mZeilen eine Leerzeile stehen , z.

My head line

My content line.
Simon
quelle
80
Dies hat den Vorteil, dass Sie unter Windows arbeiten können, wo das Zitieren von Tricks, die an anderer Stelle erwähnt wurden, nicht funktioniert. -mFür jede Zeile trennen . Nett!
Ddotsenko
8
Mit dieser Methode erstellte Nachrichten werden auf GitHub, GitHub für Windows und TortoiseGit korrekt angezeigt.
Richard
12
@ddotsenko dies ist der Vorteil der Arbeit unter Linux / Mac, wo wir eine anständige Shell haben =)
Ciro Santilli 法轮功 病毒 审查 六四 事件 法轮功
7
Von man git commit: -m <msg>, --message = <msg> Verwenden Sie die angegebene <msg> als Festschreibungsnachricht. Wenn mehrere -m-Optionen angegeben werden, werden deren Werte als separate Absätze verkettet.
Amedee Van Gasse
55
Beachten Sie, dass dadurch separate Absätze erstellt werden - keine Zeilen. Es wird also eine leere Zeile zwischen jeweils zwei -mZeilen geben.
Ohad Schneider
398

Mit Git über die Befehlszeile mit Bash können Sie Folgendes tun:

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

Einfach eingeben und drücken Enter Sie einfach ein Sie, wenn Sie eine neue Zeile möchten. Das Symbol ">" bedeutet, dass Sie gedrückt Enterhaben und es eine neue Zeile gibt. Andere Antworten funktionieren auch.

esse
quelle
6
Abizerns Antwort verdeutlichte für mich, warum dies funktioniert - die Bash-Shell interpretiert einen <kbd> Enter </ kbd> -Tastendruck als neue Zeile, bis das erste doppelte Anführungszeichen "geschlossen" ist (mit einem nachfolgenden doppelten Anführungszeichen).
Kenny Evitt
1
Ich muss zustimmen, dass dies eine viel effektivere, einfachere und praktischere Lösung ist als die akzeptierte Antwort. Es funktioniert gut für mich mit Git 1.8.2.1. +1 von mir.
Crmpicco
Dies ist keine spezielle Funktion der Eingabetaste , sondern bezieht sich auf die Anführungszeichen. Ob Sie doppelte oder einfache Anführungszeichen verwenden, spielt keine Rolle, außer für die variable Erweiterung und das Ausblenden von Sonderzeichen. Deshalb habe ich in meiner Antwort einfache Anführungszeichen gewählt.
Simon Richter
2
Verwenden Sie dies nicht in zsh! Das Terminal wird geschlossen und Sie verlieren, was Sie eingegeben haben.
Laike9m
3
Funktioniert in Gitbash für Windows.
Omar Tariq
111

Sie sollten in der Lage sein zu verwenden

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

Aus dem Bash-Handbuch :

Wörter der Form $ ' string ' werden speziell behandelt. Das Wort wird zu Zeichenfolge erweitert , wobei Zeichen mit Backslash-Escapezeichen gemäß ANSI C-Standard ersetzt werden.

Dies beinhaltet die Unterstützung für Zeilenumbrüche wie oben gezeigt sowie Hex- und Unicode-Codes und andere. Gehen Sie zum verknüpften Abschnitt, um eine Liste der Zeichen mit umgekehrten Schrägstrichen anzuzeigen.

Bis auf weiteres angehalten.
quelle
@rsy: Welche Version von Bash benutzt du? Was sehen Sie, wenn Sie es tun echo $'one\ntwo'?
Bis auf weiteres angehalten.
1
rsy $ bash --version GNU bash, Version 3.2.53 (1) -freigabe (x86_64-apple-darwin13) Copyright (C) 2007 Free Software Foundation, Inc. Die Ausgabe dieses Befehls wird erwartungsgemäß in zwei verschiedenen Ausführungen angezeigt Linien!
ccoutinho
Für mich unter Windows 7 ist es die beste Option. Danke
Mohamad Ali
2
Das $ ist hier der Schlüssel und ich habe es auf den ersten Blick nicht bemerkt. Ansonsten bekomme ich nur ein \ n in der Mitte meiner Nachricht.
ChrisBob
1
Sie müssen nicht einmal das $ '...' für die gesamte Zeichenfolge verwenden. Wenn Sie dies nur um das Zeilenumbruchzeichen herum verwenden, funktioniert Folgendes : git commit -m "first line"$'\n'"second line". Beachten Sie nur, dass Sie die vorherige Zeichenfolge schließen müssen, bevor Sie mit dem Starten beginnen $'string'.
PlasmaBinturong
95

Hinzufügen von Zeilenumbrüchen zu Ihrem Git-Commit

Versuchen Sie Folgendes, um eine mehrzeilige Festschreibungsnachricht zu erstellen:

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

Überprüfen Sie dann, was Sie getan haben:

git log -1

Sie sollten am Ende so etwas haben:

Mehrzeilige Git-Commit-Nachricht in PowerShell

Der Screenshot stammt aus einem Beispiel, das ich mit PowerShell mit Poshgit eingerichtet habe.

Jon Crowell
quelle
7
Tolle Antwort. Ich habe mich lange danach umgesehen und zahlreiche verschiedene Möglichkeiten ausprobiert, um meine Git-Commit-Nachrichten zu formatieren, aber das funktioniert am besten. Ich kann bestätigen, dass es an der Eingabeaufforderung mit Git 1.8.2.1 funktioniert.
Crmpicco
1
In Powershell können Sie `n für Zeilenumbruch tun
Ecropolis
2
In Git Bash für Windows hat es sehr gut funktioniert .
Ulysses Alves
1
Dies sollte die gewählte Antwort sein, da es die am besten kompatible Methode ist. Dies hängt nicht von einer bestimmten CLI-Eingabeaufforderung ab, wie dies bei einigen anderen Vorschlägen der
1
Dies ist eine bessere Antwort und sollte als Antwort ausgewählt werden. Dies entspricht nicht nur dem Standardverhalten und bietet eine viel sauberere Festschreibungsnachricht, sondern ist auch mit mehreren -m etwas flexibler. Auch wenn es Windows-spezifisch aussieht und Windows-bezogene Kommentare hervorgerufen hat, funktioniert es auch unter Linux einwandfrei.
0xc0de
44

So etwas tun

git commit -m"test\ntest"

funktioniert nicht, aber so ähnlich

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

funktioniert, aber es ist nicht sehr hübsch. Sie haben git-commitlbin Ihrem einen Befehl eingerichtet, PATHder ungefähr so ​​funktioniert:

#!/bin/bash

message=$1

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

Und benutze es so:

git commitlb "line1\nline2\nline3"

Ein Wort der Warnung, ich habe das Gefühl, dass die allgemeine Konvention darin besteht, eine Zusammenfassungszeile als erste Zeile und dann zwei Zeilenumbrüche und dann eine erweiterte Nachricht in der Festschreibungsnachricht zu haben. Wenn Sie also so etwas tun, wird diese Konvention verletzt. Sie könnten natürlich tun:

git commitlb "line1\n\nline2\nline3"
Peter Farmer
quelle
8
+1 Es war diese allgemeine Konvention, die mich dazu brachte, diesen Weg hinunterzuschauen. Vielen Dank
Alan Whitelaw
39

Aus der Git-Dokumentation :

-m <msg>
--message = <msg>
Verwenden Sie die angegebene <msg> als Festschreibungsnachricht . Wenn mehrere -mOptionen angegeben sind, werden deren Werte als separate Absätze verkettet.

Wenn Sie also mehrere Festschreibungsnachrichten gruppieren möchten, sollte dies die folgende Aufgabe erfüllen:

git commit -m "commit message1" -m "commit message2"
Saravanan M.
quelle
Agnostische Lösung (schalenunabhängig). Danke dafür. Wir müssen RTFM :)
Mat M
38

Ich hoffe, dass dies nicht zu weit von der gestellten Frage entfernt ist, sondern den Standardeditor festlegt und dann verwendet

git commit -e

könnte viel bequemer sein.

Tobse
quelle
2
Dieser sollte die beste Antwort sein.
hxpax
5
Sie können das -e
weglassen
Dies war die Antwort, nach der ich gesucht habe.
Tinmarino
28

Es ist nicht nötig, das Zeug zu komplizieren. Nach der -m "text...nächsten Zeile wird durch Drücken von Enter. Wann Entergedrückt wird, >erscheint. Wenn Sie fertig sind, "drücken Sie einfach 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
quelle
1
Diese Antwort bekommt nicht genug Liebe!
cBlaine
1
Dies ist eine großartige Antwort. Neue Zeilen werden auf Github korrekt angezeigt. Die erste Zeile wird als Überschrift angezeigt.
Yogesh Umesh Vaity
18

Ich verwende zsh auf einem Mac und kann mehrzeilige Festschreibungsnachrichten in doppelten Anführungszeichen (") veröffentlichen. Grundsätzlich tippe ich weiter und drücke die Eingabetaste für neue Zeilen, aber die Nachricht wird erst an Git gesendet, wenn ich die Anführungszeichen schließe und zurückkehre .

Abizern
quelle
7
Sie können das gleiche in Bash tun.
Peter Farmer
17

In Bash / Zsh können Sie einfach wörtliche Zeilenumbrüche in Anführungszeichen verwenden:

git commit -m 'Multi-line
commit
message'

ANSI-C-Zitate funktionieren auch in Bash / Zsh:

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

Sie können Git auch anweisen, einen Editor Ihrer Wahl zum Bearbeiten der Festschreibungsnachricht zu verwenden. Aus den Dokumenten zu git-commit :

Der zum Bearbeiten der Festschreibungsprotokollnachricht verwendete Editor wird aus der GIT_EDITORUmgebungsvariablen, der core.editorKonfigurationsvariablen, der VISUALUmgebungsvariablen oder der EDITOR Umgebungsvariablen (in dieser Reihenfolge) ausgewählt. Siehe git-var für Details.

Eugene Yarmash
quelle
5

Persönlich finde ich es am einfachsten, Commit-Nachrichten nachträglich in vi(oder was auch immer Ihr Git-Editor Ihrer Wahl ist) zu ändern, anstatt in der Befehlszeile, indem Sie git commit --amenddirekt danach vorgehen git commit.

amphibient
quelle
6
Sie können das gleiche Ergebnis erzielen, ohne Änderungen vornehmen zu müssen, indem Sie nur verwenden git commit -e.
Nathan Hinchey
4
Oder einfach git commit, und es wird ein Editor mit einer Commit-Nachrichtenvorlage geöffnet.
Jim Stewart
5

Wenn Sie Bash verwenden, drücken Sie C-x C-e( Ctrl+x Ctrl + e) und der aktuelle Befehl wird in Ihrem bevorzugten Editor geöffnet.

Sie können den bevorzugten Editor ändern, indem Sie VISUALund anpassenEDITOR .

Das habe ich in meinem .bashrc:

export ALTERNATE_EDITOR=''
export EDITOR='emacsclient -t'
export VISUAL='emacsclient -c'
export SUDO_EDITOR='emacsclient -t'
Aleks-Daniel Jakimenko-A.
quelle
1
Warum hat jemand dies abgelehnt? Dies ist die bequemste Art, mit mehrzeiligen Befehlen in Bash zu arbeiten. Sie müssen sie nur einmal richtig konfigurieren. Ich habe andere dumme Vorschläge verwendet, die in anderen Antworten hier gezeigt werden, aber sobald Sie gelernt haben, Ihre Befehle in Ihrem bevorzugten Texteditor zu bearbeiten, gibt es einfach keinen Weg zurück.
Aleks-Daniel Jakimenko-A.
1
Das ist so herzzerreißend nützlich, dass ich einfach nicht glauben kann, dass ich meine letzten Jahre ohne dies gelebt habe.
SoonDead
2

Hier ist eine Liste der fehlgeschlagenen Lösungen unter Windows mit der Standard-Shell cmd.exe (um Zeit beim Ausprobieren zu sparen!):

  • git commit -m 'Hello Enter funktioniert nicht: Es wird nicht nach einer neuen Zeile gefragt

  • git commit -m "Hello Enter idem

  • git commit -m "Hello^ Enter idem

  • git commit -m 'Hello^ Enter World'sieht aus wie arbeiten, weil es fragt "Mehr?" und erlaubt das Schreiben einer neuen Zeile, aber schließlich werden git logSie feststellen, dass es sich immer noch um eine einzeilige Nachricht handelt ...

TL; DR: Auch wenn unter Windows die Befehlszeilenanalyse anders funktioniert und ^mehrzeilige Eingaben zulässt, hilft dies hier nicht weiter.

Schließlich git commit -eist wahrscheinlich die beste Option.

Basj
quelle
Verwenden Sie diese traurige, traurige Entschuldigung nur nicht für ein "Shell" -Fensterangebot.
Bis zum
2

Leider scheint Git in seiner Nachricht kein Zeilenumbruchzeichen zuzulassen. Es gibt bereits verschiedene vernünftige Lösungen, aber beim Skripten sind diese ärgerlich. Hier funktionieren Dokumente auch, können aber auch etwas zu nervig sein, um damit umzugehen (denken Sie an Yaml-Dateien).

Folgendes habe ich getan:

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

Dies ist zwar auch noch hässlich, erlaubt aber "Einzeiler", die immer noch nützlich sein können. Da die Zeichenfolgen normalerweise Variablen sind oder mit Variablen kombiniert werden, können die Hässlichkeiten auf ein Minimum beschränkt werden.

oliver
quelle
1

Ich sehe niemanden, der das erwähnt, wenn Sie keine Nachricht übermitteln Nano für Sie geöffnet wird (zumindest unter Linux), wo Sie mehrere Zeilen schreiben können ...

Nur das brauchte:

git commit
Rodrigo Graça
quelle