Додайте перерву рядка до 'git commit -m' з командного рядка


746

Я використовую Git з командного рядка і намагаюся додати розрив рядка до повідомлення фіксації (використовуючи git commit -m ""), не заходячи у Vim.

Чи можливо це?


6
Як зауваження, ось посилання, яке підсумовує конвенції про добрі вчинення повідомлень - github.com/erlang/otp/wiki/Writing-good-commit-messages, якщо це комусь допомагає.
WeirdElfB0y

5
Щось подібне GIT_EDITOR="emacs" git commit -m 'paragraph1' -m 'paragraph2' -eдопоможе вам уникнути vim.
jotik

Відповіді:


693

Звичайно, як це робиться, залежить від вашої оболонки. У Bash ви можете використовувати окремі лапки навколо повідомлення, а можете просто залишити цитату відкритою, що зробить запит Bash на інший рядок, поки ви не закриєте цитату. Подобається це:

git commit -m 'Message

goes
here'

Крім того, ви можете використовувати документ "тут" (також відомий як heredoc):

git commit -F- <<EOF
Message

goes
here
EOF

53
Пізніше у відповіді Петра Фармера згадується, що конвенція Git - це, очевидно, щось на зразок: 1 рядок для підсумків, два розриви рядків, потім докладне повідомлення.
Нік Спейпк

4
Також дивіться нижче публікацію від @esse. Просте повернення вагона робить свою справу.
Хакан Енсарі

6
@MohamadAli, у Windows розбір командних рядків працює інакше
Simon Richter

2
@KelvinShadewing, так, але з тією різницею, що правила заміни оболонки застосовуються до повідомлення, тому вам потрібно уникнути знаків долара та інших метахарактерів. З іншого боку, це дозволяє використовувати змінні.
Саймон Ріхтер

2
@Nikhil, багато програм підтримують один тире як ім'я файлу, щоб означати stdin або stdout. З тут документом , то gitкоманда може читати текст повідомлення зі стандартного вводу, а -Fпараметр задає ім'я файлу , щоб прочитати повідомлення від.
Саймон Ріхтер

513

Якщо ви хочете, скажімо, заголовок та рядок вмісту, ви можете використовувати:

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

Зауважте, що це створює окремі абзаци, а не рядки. Таким чином, між двома -mрядками буде порожній рядок , наприклад:

My head line

My content line.

80
Це корисно для роботи в Windows, де цитування прийомів, згаданих в інших місцях, не працює. Окремий -mдля кожного рядка. Приємно!
ддоценко

8
Повідомлення, створені за допомогою цього методу, правильно відображаються на GitHub, GitHub для Windows та TortoiseGit.
Річард

11
@ddotsenko - це користь роботи над Linux / Mac, де ми маємо гідну оболонку =)
Ciro Santilli 冠状 病毒 审查 六四 事件 法轮功

7
Від man git commit: -m <msg>, --message = <msg> Використовуйте даний <msg> як повідомлення фіксації. Якщо задано кілька варіантів -m, їх значення об'єднуються у окремі абзаци.
Амедей Ван Гассе

55
Зауважте, що це створює окремі абзаци, а не рядки. Отже, між кожними двома -mрядками буде порожній рядок .
Охад Шнайдер

398

За допомогою Git з командного рядка з Bash ви можете зробити наступне:

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

Просто введіть і натисніть, Enterколи потрібно новий рядок, символ ">" означає, що ви натиснули Enter, і є нова лінія. Інші відповіді також працюють.


6
Відповідь Абізерна для мене пояснила, чому це працює - оболонка Bash трактує натискання клавіші <kbd> Enter </kbd> як новий рядок, поки перший символ подвійної лапки не буде закритий (з подальшим символом подвійної лапки).
Кенні Евітт

1
Я повинен погодитися, що це набагато ефективніше, простіше та практичніше рішення, ніж прийнята відповідь. Це добре працює для мене за допомогою Git 1.8.2.1. +1 від мене.
crmpicco

Це не особлива функція клавіші Enter , а скоріше пов'язана з цитатами. Чи використовуєте ви подвійні або одинарні лапки, насправді не має значення, за винятком змінних розширень та спеціальних символів - саме тому я вибрав одиночні лапки у своїй відповіді.
Саймон Ріхтер

2
Не використовуйте це в zsh! Термінал закриється, і ви втратите те, що набрали.
laike9m

3
Працює в Gitbash для Windows.
Омар Тарік

111

Ви повинні мати можливість використовувати

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

З посібника Bash :

Слова форми $ ' string "обробляються спеціально. Слово розширюється до рядка , а символи , що ухиляються від косої риски, замінюються відповідно до стандарту ANSI C.

Сюди входить підтримка нових рядків, як показано вище, плюс шістнадцятковий і Unicode код та інші. Перейдіть до пов’язаного розділу, щоб побачити список символів, що ухилилися від косої риски.


@rsy: Яку версію Bash ви використовуєте? Що ти бачиш, коли робиш echo $'one\ntwo'?
Призупинено до подальшого повідомлення.

1
rsy $ bash - версія GNU bash, версія 3.2.53 (1) -випуск (x86_64-apple-darwin13) Copyright (C) 2007 Free Software Foundation, Inc. Вихід цієї команди, як очікувалося, показаний у двох різних лінії!
ccoutinho

для мене на Windows 7 це найкращий варіант Дякую
Мохаммад Алі

2
$ Є ключовим тут, і я не помітив цього з першого погляду. Інакше я просто отримую \ n посеред мого повідомлення.
ChrisBob

1
Вам навіть не потрібно використовувати $ '...' для всього рядка; використовуючи це як раз навколо символу нового рядка працюватиме: git commit -m "first line"$'\n'"second line". Просто зауважте, що ви повинні закрити попередній рядок, перш ніж починати свій $'string'.
ПлазмаBinturong

95

Додавання перерв рядків до вашого Git

Спробуйте виконати наступне, щоб створити багаторядкове повідомлення про фіксацію:

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

Потім перевірте, що ви зробили:

git log -1

Ви повинні закінчити щось подібне:

Багаторядкове повідомлення про прихильність Git в PowerShell

Скріншот - із прикладу, який я створив за допомогою PowerShell з Poshgit.


7
Дивовижна відповідь. Я протягом багатьох років оглядав це і намагався чимало різних способів відформатувати мої повідомлення Git počin, але це працює найкраще. Я можу підтвердити, що він працює підказки з Git 1.8.2.1.
crmpicco

1
У Powershell ви можете зробити `n для розриву лінії
Ecropolis

2
Для мене це працювало в Git Bash для Windows .
Улісс Алвес

1
Це має бути обрана відповідь, оскільки це найбільш сумісний метод, це не покладається на будь-який запит CLI, як це роблять деякі інші пропозиції ..

1
Це краща відповідь, і її слід вибрати як відповідь. Це не лише відповідає поведінці за замовчуванням, і забезпечує набагато більш чітке повідомлення про фіксацію, але також є дещо гнучкішим із множиною -m. Навіть незважаючи на те, що він виглядає специфічно для Windows і залучає коментарі, пов'язані з Windows, він добре працює і в Linux.
0xc0de

44

Робити щось подібне

git commit -m"test\ntest"

не працює, але щось подібне

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

працює, але це не дуже красиво. Ви встановлюєте git-commitlbкоманду, PATHяка робить щось подібне:

#!/bin/bash

message=$1

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

І використовуйте його так:

git commitlb "line1\nline2\nline3"

Слово попередження, я маю відчуття, що загальною умовою є створення зведеного рядка як першого рядка, а потім двох розривів рядків, а потім розширеного повідомлення у повідомленні про фіксацію, тому щось подібне порушить цю умову. Можна, звичайно, зробити:

git commitlb "line1\n\nline2\nline3"

8
+1 саме ця загальна конвенція змусила мене дивитись на цей маршрут. Спасибі
Алан Уайтлав,

39

З документації Git :

-m <msg>
--message = <msg>
Використовуйте поданий <msg> як повідомлення фіксації. Якщо -mзадано кілька варіантів, їх значення об'єднуються у окремі абзаци.

Отже, якщо ви шукаєте групування декількох повідомлень про фіксацію, це має зробити цю роботу:

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

Агностичний розчин (незалежно від оболонки). Дякую за це Нам потрібно RTFM :)
Мат М

38

Я сподіваюся, що це не веде занадто далеко від опублікованого питання, але встановивши редактор за замовчуванням і потім скористайтеся

git commit -e

може бути набагато комфортніше.


2
Цей має бути найкращим прихильником.
hxpax

5
Ви можете залишити його, -eі він все одно відкриє редактор
djangonaut

Ця відповідь була шуканою мною.
Tinmarino

28

Не потрібно ускладнювати речі. Після отримання -m "text...наступного рядка натисканням клавіші Enter. Коли Enterнатискається, >з'являється. Коли ви закінчите, просто покладіть "і натисніть 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
Ця відповідь не отримує достатньо любові!
cBlaine

1
Це чудова відповідь, нові рядки правильно показані на Github. Перший рядок відображається як заголовок.
Йогеш Умеш Ваіті

18

Я використовую zsh на Mac, і я можу розміщувати багаторядкові повідомлення про фіксацію в межах подвійних лапок ("). В основному я продовжую вводити та натискати на повернення для нових рядків, але повідомлення не надсилається до Git, поки я не закрию лапки та повернуся .


7
Ви можете зробити те ж саме в баш.
Пітер Фермер

17

У Bash / Zsh ви можете просто використовувати буквальні розриви рядків всередині лапок:

git commit -m 'Multi-line
commit
message'

Цитування ANSI-C також працює в Bash / Zsh:

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

Ви також можете доручити Git використовувати редактор на ваш вибір для редагування повідомлення про фіксацію. З документів на git-commit :

Редактор, який використовується для редагування повідомлення журналу фіксації, буде обраний із GIT_EDITORзмінної середовища, змінної core.editorконфігурації, змінної VISUALсередовища або EDITOR змінної середовища (у цьому порядку). Детальніше див. У git-var .


5

Особисто мені здається, що найпростіше змінювати повідомлення фіксації після факту в vi(або будь-якому обраному вами редакторі git), а не в командному рядку, виконуючи це git commit --amendвідразу після git commit.


6
Ви можете досягти цього ж результату без необхідності вносити зміни, просто використовуючи git commit -e.
Натан Хінчі

4
Або просто git commit, і він відкриє редактор з шаблоном повідомлення про фіксацію.
Джим Стюарт

5

Якщо ви використовуєте Bash, натисніть C-x C-e( Ctrl+ x Ctrl+ e), і вона відкриє поточну команду в уподобаному редакторі.

Ви можете змінити бажаний редактор, налаштувавши VISUALта EDITOR.

Ось що я маю в своєму .bashrc:

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

1
То чому хтось спротив це? Це найзручніший спосіб роботи з багаторядковими командами в bash, потрібно просто налаштувати його правильно один раз. Я використовував інші дурні пропозиції, показані в інших відповідях тут, але як тільки ви навчитесь редагувати свої команди у вашому улюбленому текстовому редакторі, назад вже просто немає.
Алекс-Даніель Якименко-А.

1
Це настільки сердечно корисно, що я просто не можу повірити, що я прожив свої минулі роки без цього.
Незабаром

2

Ось список несправних рішень для Windows зі стандартною оболонкою cmd.exe (щоб заощадити час проб і помилок!):

  • git commit -m 'Hello Enter не працює: він не запитує новий рядок

  • git commit -m "Hello Enter ідем

  • git commit -m "Hello^ Enter ідем

  • git commit -m 'Hello^ Enter World'виглядає як робота, тому що вона запитує "Більше?" і дозволяє написати новий рядок, але, нарешті, коли git logви будете робити, ви побачите, що це все одно однорядкове повідомлення ...

TL; DR: Навіть якщо в Windows синтаксичний розбір командних рядків працює по- іншому і ^дозволяє вводити багато рядків, тут це не допомагає.

Нарешті git commit -e, мабуть, найкращий варіант.


Тільки не використовуйте цей сумний, сумний привід для «оболонки» вікон.
jthill

2

На жаль, git, здається, не допускає жодного символу нового рядка у своєму повідомленні. Вище є різні розумні рішення, але при написанні сценаріїв це дратує. Тут також працюють документи, але вони можуть бути занадто прикрою для вирішення (думаю, файли Yaml)

Ось що я зробив:

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

Незважаючи на те, що це все ще некрасиво, воно дозволяє створювати "одноводки", які можуть бути корисними. Оскільки зазвичай рядки є змінними або поєднуються зі змінними, uglynes можуть бути зведені до мінімуму.


1

Я не бачу, щоб хтось згадував, що якщо ви не надасте повідомлення, воно відкриє нано (принаймні в Linux), де ви можете написати кілька рядків ...

Потрібно лише це:

git commit
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.