从命令行向'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

Answers:


693

当然,它的完成方式取决于您的shell。在Bash中,您可以在消息周围使用单引号,并且可以仅打开引号,这将使Bash提示另一行,直到关闭引号为止。像这样:

git commit -m 'Message

goes
here'

或者,您可以使用“此处文档”(也称为heredoc):

git commit -F- <<EOF
Message

goes
here
EOF

53
@Peter Farmer在稍后的回答中提到,Git约定显然类似于:1行总结,两个换行,然后是一条详细消息。
Nick Spacek

4
另外,请参阅下面@esse的帖子。一个简单的回车就可以了。
哈坎·恩萨里

6
在Windows上的@MohamadAli,命令行解析的工作方式有所不同
Simon Richter

2
@KelvinShadewing,是的,但是区别在于外壳替换规则适用于消息,因此您需要转义美元符号和其他元字符。另一方面,它允许您使用变量。
西蒙·里希特

2
@Nikhil,许多程序都将单破折号作为文件名来表示stdin或stdout。使用here文档,该git命令可以从stdin中读取消息文本,并且该-F选项提供了从中读取消息的文件名。
西蒙·里希特

513

例如,如果您只想要标题行和内容行,则可以使用:

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

请注意,这将创建单独的段落-而不是行。所以每两个之间会有一个空白行-m,例如:

My head line

My content line.

80
在Windows上工作的好处是,在其他地方引用的引用技巧不起作用。-m每行分开。真好!
ddotsenko

8
使用此方法创建的消息可以在GitHub,适用于Windows的GitHub和TortoiseGit上正确显示。
理查德

11
@ddotsenko,这是在Linux / Mac上工作的好处,在那里我们有一个不错的外壳=)
Ciro Santilli冠状病毒审查六四事件法轮功

7
来自man git commit:-m <msg>,-message = <msg>使用给定的<msg>作为提交消息。如果给出了多个-m选项,则它们的值将串联为单独的段落。
Amedee Van Gasse 2015年

55
请注意,这将创建单独的段落 -而不是行。因此,每两行之间将有一个空白行-m
Ohad Schneider

398

使用命令行和Bash一起使用Git可以执行以下操作:

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

只需键入并按一下,Enter当您需要换行时,“>”符号表示您已按Enter,并且有新行。其他答案也可以。


6
Abizern的答案为我澄清了它为什么起作用– Bash shell将<kbd> Enter </ kbd>按键解释为新行,直到第一个双引号字符“ closed”(以及随后的双引号字符)为止。
肯尼·埃维特

1
我必须同意,这是一个比公认的答案更有效,更简便和实用的解决方案。使用Git 1.8.2.1对我来说效果很好。向我+1。
crmpicco

这不是Enter键的特殊功能,而是与引号相关。除了变量扩展和转义特殊字符外,使用双引号还是单引号并不重要,这就是为什么我在答案中选择了单引号。
西蒙·里希特

2
不要在zsh中使用它!终端将关闭,您输入的内容将丢失。
laike9m 2015年

3
在Windows的Gitbash中工作。
奥马尔·塔里克

110

您应该可以使用

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

Bash手册

$' string ' 形式的单词会被特殊对待。该单词扩展为 string,并按ANSI C标准的规定替换了反斜杠转义的字符。

这包括对上述换行符的支持,以及十六进制和Unicode代码及其他。转到链接的部分以查看反斜杠转义字符的列表。


@rsy:您正在使用什么版本的Bash?您做echo $'one\ntwo'什么时会看到什么?
暂停,直到另行通知。

1
rsy $ bash --version GNU bash,版本3.2.53(1)-发行版(x86_64-apple-darwin13)版权所有(C)2007 Free Software Foundation,Inc。该命令的输出如预期的那样以两种不同的方式显示线!
ccoutinho 2015年

在Windows 7上对我来说是最好的选择谢谢
Mohamad Ali

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

您应该以如下形式结束:

PowerShell中的多行Git提交消息

屏幕截图来自我使用Poshgit使用PowerShell设置的示例。


7
很棒的答案。我已经寻找了很长时间,并尝试了多种格式化我的Git提交消息的方法,但这是最好的。我可以在Git 1.8.2.1的提示符下确认它是否有效。
crmpicco

1
在Powershell中,您可以进行换行`n
Ecropolis

2
Windows的Git Bash中,它对我很有用
Ulysses Alves

1
应该是所选择的答案,因为它是最兼容的方法,这种不依赖于任何特定的命令行提示符像其他一些建议,做..

1
这是一个更好的答案,应该选择它作为答案。这不仅符合默认行为,并提供了更清晰的提交消息,而且使用-m选项更灵活。同样,即使它看起来特定于Windows,并吸引了与Windows相关的注释,它在Linux中也能正常工作。
0xc0de

44

做类似的事情

git commit -m"test\ntest"

不起作用,但是类似

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

可以,但是不是很漂亮。您git-commitlbPATH其中设置了一个执行以下命令的命令:

#!/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 :)
Mat M


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上正确显示。第一行显示为标题。
Yogesh Umesh Vaity

18

我在Mac上使用zsh,并且可以在双引号(“)中发布多行提交消息。基本上,我一直在键入并按回车以换行,但是直到关闭引号并返回后,消息才发送给Git。 。


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 --amendafter之后执行git commit


6
您可以实现相同的结果,而不必通过使用进行修改git commit -e
内森·欣奇

4
或者简单地git commit,它将打开带有提交消息模板的编辑器。
吉姆·斯图尔特

5

如果您使用的是Bash,请点击C-x C-eCtrl+ x Ctrl+ e),它将在您的首选编辑器中打开当前命令。

您可以通过调整VISUAL和来更改首选编辑器EDITOR

那就是我所拥有的.bashrc

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

1
那么为什么有人反对呢?这是在bash中使用多行命令的最方便的方法,只需配置一次即可。我一直在使用此处其他答案中显示的其他愚蠢建议,但是一旦您学会了在自己喜欢的文本编辑器中编辑命令,就没有回头路了。
Aleks-Daniel Jakimenko-A。

1
这是如此令人心碎的有用,我简直不敢相信我没有这一切而活了过去的几年。
很快死了

2

这是带有标准cmd.exe shell的Windows 上失败的解决方案的列表(为您节省一些反复试验的时间!):

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

尽管这仍然很丑陋,但它允许使用“单线”,这可能仍然有用。通常情况下,字符串是变量或与变量组合在一起,因此可以将丑陋程度降至最低。


By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.