Dodaj podział wiersza do 'git commit -m' z linii poleceń


746

Korzystam z Git z wiersza poleceń i próbuję dodać podział wiersza do komunikatu zatwierdzenia (używanie git commit -m "") bez wchodzenia w Vima.

czy to możliwe?


6
Dla przypomnienia, oto link, który podsumowuje dobre konwencje komunikatów zatwierdzania - github.com/erlang/otp/wiki/Writing-good-commit-messages, jeśli komuś to pomaga.
WeirdElfB0y

5
Coś takiego GIT_EDITOR="emacs" git commit -m 'paragraph1' -m 'paragraph2' -epomoże ci uniknąć vim.
jotik

Odpowiedzi:


693

Z pewnością sposób wykonania zależy od powłoki. W Bash możesz używać pojedynczych cudzysłowów wokół wiadomości i możesz po prostu pozostawić wycenę otwartą, co spowoduje, że Bash poprosi o kolejny wiersz, dopóki nie zamkniesz cytatu. Lubię to:

git commit -m 'Message

goes
here'

Alternatywnie możesz użyć „dokumentu tutaj” (znanego również jako heredoc):

git commit -F- <<EOF
Message

goes
here
EOF

53
Odpowiedź Petera Farmera na później wspomina, że ​​konwencja Git jest podobna: 1 wiersz do podsumowania, dwa podziały wiersza, a następnie szczegółowa wiadomość.
Nick Spacek

4
Zobacz także poniższy post @esse. Prosty powrót karetki załatwia sprawę.
Hakan Ensari

6
@MohamadAli, w systemie Windows, analiza wiersza poleceń działa inaczej
Simon Richter

2
@KelvinShadewing, tak, ale z tą różnicą, że reguły zastępowania powłok mają zastosowanie do wiadomości, więc musisz unikać znaków dolara i innych metaznaków. Z drugiej strony pozwala na używanie zmiennych.
Simon Richter,

2
@Nikhil, wiele programów obsługuje pojedynczy myślnik jako nazwę pliku, co oznacza stdin lub stdout. Z tutaj dokumencie The gitkomenda może czytać tekst wiadomości ze standardowego wejścia, a -Fopcja podaje nazwę pliku, aby przeczytać wiadomość.
Simon Richter,

513

Jeśli chcesz, powiedzmy, nagłówek i wiersz treści, możesz użyć:

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

Zauważ, że tworzy to osobne akapity - nie wiersze. Tak więc między dwiema -mliniami będzie pusta linia , np .:

My head line

My content line.

80
Ma to tę zaletę, że działa w systemie Windows, w którym cytowanie sztuczek wspomnianych gdzie indziej nie działa. Oddzielnie -mdla każdej linii. Miły!
ddotsenko

8
Wiadomości utworzone przy użyciu tej metody są poprawnie wyświetlane w GitHub, GitHub dla Windows i TortoiseGit.
Richard

11
@ddotsenko jest to zaleta pracy na Linuxie / Macu, gdzie mamy przyzwoitą powłokę =)
Ciro Santilli 冠状 病毒 审查 六四 事件 法轮功

7
Od man git commit: -m <msg>, --message = <msg> Użyj podanego <msg> jako komunikatu zatwierdzenia. Jeśli podano wiele opcji -m, ich wartości są łączone jako osobne akapity.
Amedee Van Gasse,

55
Zauważ, że tworzy to osobne akapity - nie wiersze. Tak więc pomiędzy dwiema -mliniami będzie pusta linia .
Ohad Schneider,

398

Używając Git z linii poleceń w Bash, możesz wykonać następujące czynności:

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

Po prostu wpisz i naciśnij, Enterkiedy chcesz nową linię, symbol „>” oznacza, że ​​nacisnąłeś Enteri pojawiła się nowa linia. Inne odpowiedzi również działają.


6
Odpowiedź Abizerna wyjaśniła mi, dlaczego to działa - powłoka Bash interpretuje naciśnięcie klawisza <kbd> Enter </kbd> jako nowy wiersz, dopóki pierwszy znak podwójnego cudzysłowu nie zostanie „zamknięty” (z kolejnym znakiem podwójnego cudzysłowu).
Kenny Evitt,

1
Muszę się zgodzić, że jest to o wiele bardziej skuteczne, łatwiejsze i praktyczne rozwiązanie niż przyjęta odpowiedź. Działa dobrze dla mnie przy użyciu Git 1.8.2.1. +1 ode mnie
crmpicco

To nie jest specjalna funkcja klawisza Enter , ale raczej związana z cudzysłowami. To, czy używasz podwójnych czy pojedynczych cudzysłowów, nie ma tak naprawdę znaczenia, z wyjątkiem zmiennego rozwijania i znaków specjalnych - dlatego wybrałem pojedyncze cudzysłowy w mojej odpowiedzi.
Simon Richter,

2
Nie używaj tego w Zsh! Terminal zamknie się, a Ty stracisz wpisane słowo.
laike9m

3
Działa w Gitbash dla Windows.
Omar Tariq,

111

Powinieneś być w stanie używać

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

Z podręcznika Bash :

Słowa w postaci $ „ string ” są traktowane specjalnie. Słowo jest interpretowane jako ciąg znaków , a znaki specjalne z odwrotnym ukośnikiem są zastępowane zgodnie ze standardem ANSI C.

Obejmuje to obsługę znaków nowej linii, jak pokazano powyżej, a także kody szesnastkowe i Unicode i inne. Przejdź do sekcji połączonej, aby wyświetlić listę znaków, które uniknęły ukośnika.


@rsy: Jakiej wersji Bash używasz? Co widzisz kiedy to robisz echo $'one\ntwo'?
Wstrzymano do odwołania.

1
rsy $ bash --version GNU bash, wersja 3.2.53 (1) -release (x86_64-apple-darwin13) Copyright (C) 2007 Free Software Foundation, Inc. Dane wyjściowe tego polecenia są, zgodnie z oczekiwaniami, pokazane w dwóch różnych linie!
ccoutinho

dla mnie na Windows 7 to najlepsza opcja Dziękuję
Mohamad Ali

2
$ Jest tutaj kluczem i nie zauważyłem go na pierwszy rzut oka. W przeciwnym razie po prostu pojawia się \ n w środku mojej wiadomości.
ChrisBob

1
Nie musisz nawet używać $ '...' dla całego łańcucha; za pomocą tego właśnie wokół znaku nowej linii będzie działać: git commit -m "first line"$'\n'"second line". Pamiętaj, że musisz zamknąć poprzedni ciąg przed rozpoczęciem $'string'.
PlasmaBinturong

95

Dodawanie podziałów linii do zatwierdzenia Git

Spróbuj wykonać następujące czynności, aby utworzyć wieloliniowy komunikat zatwierdzenia:

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

Następnie sprawdź, co zrobiłeś:

git log -1

Powinieneś skończyć z czymś takim:

Wielowierszowy komunikat zatwierdzenia Git w PowerShell

Zrzut ekranu pochodzi z przykładu, który skonfigurowałem za pomocą programu PowerShell z Poshgit.


7
Świetna odpowiedź. Rozglądałem się za tym od wieków i próbowałem wielu różnych sposobów formatowania moich komunikatów Git, ale to działa najlepiej. Mogę potwierdzić, że działa z pytaniem w Git 1.8.2.1.
crmpicco

1
W PowerShell możesz zrobić n dla podziału linii
Ecropolis

2
W Git Bash na Windows zadziałało bardzo dobrze .
Ulysses Alves

1
To powinna być wybrana odpowiedź, ponieważ jest to najbardziej kompatybilna metoda, nie opiera się ona na żadnym konkretnym

1
To lepsza odpowiedź i powinna zostać wybrana jako odpowiedź. Nie tylko jest to zgodne z domyślnym zachowaniem i zapewnia znacznie czystszy komunikat zatwierdzenia, ale jest też nieco bardziej elastyczne z wielokrotnym -m. Mimo że wygląda na specyficzne dla systemu Windows i przyciąga uwagi związane z oknami, działa również dobrze w systemie Linux.
0xc0de

44

Robienie czegoś takiego

git commit -m"test\ntest"

nie działa, ale coś w tym rodzaju

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

działa, ale nie jest bardzo ładny. Ustawiłeś w sobie git-commitlbpolecenie, PATHktóre robi coś takiego:

#!/bin/bash

message=$1

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

I użyj tego w ten sposób:

git commitlb "line1\nline2\nline3"

Słowo ostrzeżenia, mam wrażenie, że ogólna konwencja ma mieć linię podsumowania jako pierwszą linię, a następnie dwa podziały linii, a następnie rozszerzony komunikat w komunikacie zatwierdzenia, więc zrobienie czegoś takiego złamałoby tę konwencję. Oczywiście możesz:

git commitlb "line1\n\nline2\nline3"

8
+1 to była ta ogólna konwencja, która sprawiła, że ​​spojrzałem na tę trasę. Dzięki
Alan Whitelaw,

39

Z dokumentacji Git :

-m <msg>
--message = <msg>
Użyj podanego <msg> jako komunikatu zatwierdzenia. Jeśli -mpodano wiele opcji, ich wartości są łączone jako osobne akapity.

Tak więc, jeśli szukasz grupowania wielu komunikatów zatwierdzania, powinno to wykonać tę pracę:

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

Roztwór agnostyczny (niezależny od powłoki). Dzięki za to. Musimy RTFM :)
Mat M


28

Nie ma potrzeby komplikowania rzeczy. Po przejściu -m "text...do następnej linii naciśnij Enter. Po Enternaciśnięciu >pojawia się. Kiedy skończysz, po prostu włóż "i naciśnij 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
Ta odpowiedź nie ma dość miłości!
cBlaine,

1
To świetna odpowiedź, nowe wiersze są poprawnie wyświetlane na Github. Pierwszy wiersz pokazuje się jako nagłówek.
Yogesh Umesh Vaity

18

Używam zsh na Macu i mogę wysyłać wiadomości zatwierdzające w wielu wierszach w ramach podwójnych cudzysłowów ("). Zasadniczo ciągle piszę i naciskam klawisz Return, aby uzyskać nowe wiersze, ale wiadomość nie jest wysyłana do Gita, dopóki nie zamknę cytatów i nie wrócę .


7
Możesz zrobić to samo w bash.
Peter Farmer

17

W Bash / Zsh możesz po prostu używać dosłownego podziału linii w cudzysłowie:

git commit -m 'Multi-line
commit
message'

Cytowanie ANSI-C działa również w Bash / Zsh:

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

Możesz także poinstruować Git, aby używał dowolnego edytora do edycji wiadomości zatwierdzenia. Z dokumentów na temat git-commit :

Edytor używany do edycji komunikatu dziennika zatwierdzenia zostanie wybrany ze GIT_EDITORzmiennej środowiskowej, zmiennej core.editorkonfiguracyjnej, zmiennej VISUALśrodowiskowej lub EDITOR zmiennej środowiskowej (w tej kolejności). Zobacz git-var, aby uzyskać szczegółowe informacje.


5

Osobiście uważam, że najłatwiej jest modyfikować komunikaty zatwierdzania po fakcie vi(lub jakimkolwiek innym edytorze git), a nie w wierszu poleceń, robiąc to git commit --amendzaraz po git commit.


6
Możesz osiągnąć ten sam wynik bez konieczności zmiany, używając tylko git commit -e.
Nathan Hinchey

4
Lub po prostu git commiti otworzy edytor z szablonem komunikatu zatwierdzenia.
Jim Stewart

5

Jeśli używasz Bash, naciśnij C-x C-e( Ctrl+ x Ctrl+ e), a otworzy się bieżące polecenie w preferowanym edytorze.

Możesz zmienić preferowanego edytora, modyfikując VISUALi EDITOR.

Oto co mam w moim .bashrc:

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

1
Dlaczego więc ktoś głosował za tym? Jest to najwygodniejszy sposób pracy z poleceniami wielowierszowymi w bash, wystarczy tylko raz go skonfigurować. Korzystałem z innych głupich sugestii pokazanych w innych odpowiedziach tutaj, ale kiedy nauczysz się edytować swoje polecenia w swoim ulubionym edytorze tekstów, nie ma już odwrotu.
Aleks-Daniel Jakimenko-A.

1
Jest to tak niezwykle przydatne, że po prostu nie mogę uwierzyć, że bez tego przeżyłem swoje poprzednie lata.
Wkrótce Dead

2

Oto lista wadliwych rozwiązań w systemie Windows ze standardową powłoką cmd.exe (aby zaoszczędzić trochę czasu na próby i błędy!):

  • git commit -m 'Hello Enter nie działa: nie poprosi o nową linię

  • git commit -m "Hello Enter ten sam

  • git commit -m "Hello^ Enter ten sam

  • git commit -m 'Hello^ Enter World'wygląda na działający, ponieważ pyta „Więcej?” i pozwala napisać nową linię, ale w końcu git logzobaczysz, że jest to nadal wiadomość jednowierszowa ...

TL; DR: Nawet jeśli w systemie Windows parsowanie wiersza poleceń działa inaczej i ^umożliwia wprowadzanie danych wielowierszowych, tutaj nie pomaga.

Wreszcie git commit -ejest prawdopodobnie najlepszą opcją.


Po prostu nie używaj tej smutnej, smutnej wymówki do zaoferowania „powłoki” systemu Windows.
jthill

2

Niestety, git wydaje się nie dopuszczać znaku nowej linii w swoim komunikacie. Istnieją już różne rozsądne rozwiązania, ale przy skryptowaniu są denerwujące. Tutaj dokumenty również działają, ale mogą być również zbyt denerwujące, aby sobie z nimi poradzić (pomyśl o plikach yaml)

Oto co zrobiłem:

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

Chociaż jest to nadal brzydkie, pozwala na stosowanie „jednowarstwowych”, które mogą być nadal przydatne. Ponieważ zwykle łańcuchy są zmienne lub łączone ze zmiennymi, brzydoty można ograniczyć do minimum.


1

Nie widzę nikogo, kto wspomniałby, że jeśli nie podasz wiadomości , otworzy się dla ciebie nano (przynajmniej w Linuksie), w którym możesz napisać wiele wierszy ...

Potrzebne tylko:

git commit
Korzystając z naszej strony potwierdzasz, że przeczytałeś(-aś) i rozumiesz nasze zasady używania plików cookie i zasady ochrony prywatności.
Licensed under cc by-sa 3.0 with attribution required.