Добавьте разрыв строки в 'git commit -m' из командной строки

748

Я использую 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

Ответы:

696

Конечно, как это сделать, зависит от вашей оболочки. В 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 парсинг командной строки работает иначе
Саймон Рихтер
2
@KelvinShadewing, да, но с той разницей, что правила замены оболочки применяются к сообщению, поэтому вам нужно избегать знаков доллара и других метасимволов. С другой стороны, это позволяет вам использовать переменные.
Саймон Рихтер
2
@Nikhil, многие программы поддерживают одну черту в качестве имени файла, означающего стандартный ввод или стандартный вывод. С здесь документом , то gitкоманда может читать текст сообщения из стандартного ввода, а -Fпараметр задает имя файла , чтобы прочитать сообщение от.
Саймон Рихтер
515

Если вы просто хотите, скажем, заголовок и строку содержимого, вы можете использовать:

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.
Ричард
12
@ddotsenko это преимущество работы на Linux / Mac, где у нас есть приличная оболочка =)
Ciro Santilli 郝海东 冠状 病 六四 事件 法轮功
7
From 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.

Это включает в себя поддержку новых строк, как показано выше, а также шестнадцатеричные и юникод-коды и другие. Перейдите в связанный раздел, чтобы увидеть список символов с обратной косой чертой.

Приостановлено до дальнейшего уведомления.
источник
@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'.
PlasmaBinturong
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 commit, но это работает лучше всего. Я могу подтвердить, что он работает в командной строке с 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

может быть гораздо удобнее.

Tobse
источник
2
Этот должен быть лучшим ответом.
hxpax
5
Вы можете оставить его, -eи он все равно откроет редактор
djangonaut
Это был ответ, который я искал.
Тинмарино
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 ...
blongho
источник
1
Этот ответ не получает достаточно любви!
cBlaine
1
Это отличный ответ, новые строки отображаются правильно на Github. Первая строка отображается как заголовок.
Йогеш Умеш Ваиты
18

Я использую zsh на Mac и могу публиковать многострочные сообщения в двойных кавычках ("). По сути, я продолжаю набирать и нажимать клавишу возврата для новых строк, но сообщение не отправляется в Git, пока я не закрою кавычки и не вернусь ,

Abizern
источник
7
Вы можете сделать то же самое в Bash.
Питер Фармер
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.

amphibient
источник
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, наверное, лучший вариант.

Basj
источник
Только не используйте это грустное, грустное оправдание для «оболочки» оконных предложений.
jthill
2

К сожалению, git, похоже, не учитывает символы новой строки в своем сообщении. Выше уже есть несколько разумных решений, но при написании сценариев это раздражает. Здесь также работают документы, но они могут быть слишком раздражающими (например, файлы yaml)

Вот что я сделал:

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

Хотя это также все еще уродливо, оно допускает «однострочные», которые все еще могут быть полезны. Поскольку обычно строки являются переменными или объединяются с переменными, углины могут быть сведены к минимуму.

Оливер
источник
1

Я не вижу, чтобы кто-нибудь упоминал, что если вы не предоставите сообщение, оно откроет вам nano (по крайней мере, в Linux), где вы можете написать несколько строк ...

Только это необходимо:

git commit
Родриго Граса
источник