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?

Alan Whitelaw
źródło
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
Simon Richter
źródło
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.
Szymon
źródło
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ą.

esse
źródło
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.

Wstrzymano do odwołania.
źródło
@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.

Jon Crowell
źródło
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"
Peter Farmer
źródło
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"
Saravanan M.
źródło
Roztwór agnostyczny (niezależny od powłoki). Dzięki za to. Musimy RTFM :)
Mat M
38

Mam nadzieję, że nie prowadzi to zbyt daleko od opublikowanego pytania, ale ustawienie domyślnego edytora, a następnie użycie

git commit -e

może być znacznie wygodniejszy.

Tobse
źródło
2
Ten powinien być najlepszą odpowiedzią.
hxpax
5
możesz zostawić -ei nadal będzie otwierać edytor
djangonaut
To była odpowiedź, której szukałem.
Tinmarino,
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 ...
blongho
źródło
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ę .

Abizern
źródło
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.

Eugene Yarmash
źródło
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.

amfibia
źródło
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'
Aleks-Daniel Jakimenko-A.
źródło
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ą.

Basj
źródło
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.

oliver
źródło
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
Rodrigo Graça
źródło