从命令行向'git commit -m'添加换行符

Ala*_*law 693 git bash shell

我从命令行使用Git,并尝试在提交消息(使用git commit -m "")中添加换行符而不进入Vim.

这可能吗?

Sim*_*ter 637

当然,它是如何完成的取决于你的shell.在Bash中,您可以在消息周围使用单引号,并且可以保持报价打开,这将使Bash提示另一行,直到您关闭报价.像这样:

git commit -m 'Message

goes
here'
Run Code Online (Sandbox Code Playgroud)

或者,您可以使用"此处文档":

git commit -F- <<EOF
Message

goes
here
EOF
Run Code Online (Sandbox Code Playgroud)

  • @Peter Farmer后来的回答提到Git约定显然是这样的:1行总结,两行换行,然后是详细信息. (49认同)
  • @MohamadAli,在Windows上,命令行解析工作[不同](http://stackoverflow.com/questions/605686) (6认同)
  • 另外,请参阅@esse下面的帖子.一个简单的回车就可以了. (4认同)
  • @Nikhil,许多程序都支持将单个破折号作为文件名来表示标准输入或标准输出。使用*here document*,`git` 命令可以从stdin 读取消息文本,`-F` 选项给出读取消息的文件名。 (3认同)
  • 双引号也可以使用吗? (2认同)
  • @KelvinShadewing,是的,但是区别在于外壳替换规则适用于该消息,因此您需要转义美元符号和其他元字符。另一方面,它允许您使用变量。 (2认同)
  • @SimonRichter 在 Windows 命令行解析的工作方式不同,但仍然无法使用 `git commit -m "Hello^` &lt;Enter&gt; `World"`。输入将在 2 行中给出,但是在执行 `git log` 时,您只会看到一行。 (2认同)

Sim*_*mon 454

如果你只想要一条头条和一条内容,你可以使用:

git commit -m "My head line" -m "My content line."
Run Code Online (Sandbox Code Playgroud)

  • 这有利于在Windows上工作,其中引用其他地方提到的技巧不起作用.每行分开`-m`.太好了! (79认同)
  • 请注意,这会创建单独的*段* - 而不是行.因此每两个`-m`行之间会有一个空行. (51认同)
  • @ddotsenko这是在Linux/Mac上工作的好处,我们有一个像样的shell =) (11认同)
  • 使用此方法创建的消息在GitHub,GitHub for Windows和TortoiseGit上正确显示. (8认同)
  • 从`man git commit`: - m <msg>, - message = <msg>使用给定的<msg>作为提交消息.如果给出多个-m选项,则它们的值将作为单独的段落连接. (6认同)
  • 只是为了向任何可能误解 @Ohad-Schneider 的大量赞成评论的人澄清——根据通用惯例,单独的“段落”是_所需的_行为。 (2认同)

ess*_*sse 386

使用Bash命令行中的Git,您可以执行以下操作:

git commit -m "this is
> a line
> with new lines
> maybe"
Run Code Online (Sandbox Code Playgroud)

只需键入并Enter在需要新行时按下Enter,">"符号表示您已按下,并且有一个新行.其他答案也有效.

  • [Abizern的答案](http://stackoverflow.com/a/5064694/173497)为我澄清了为什么这样做 - Bash shell将<kbd> Enter </ kbd>按键解释为新行直到第一个双-quote字符是'已关闭'(后续双引号字符). (5认同)
  • 适用于Windows的Gitbash. (3认同)
  • 这不是 *Enter* 键的特殊功能,而是与引号相关。除了变量扩展和转义特殊字符之外,使用双引号还是单引号并不重要——这就是我在答案中选择单引号的原因。 (2认同)
  • 不要在zsh中使用它!终端将关闭,您输入的内容将丢失. (2认同)

Pau*_*ce. 102

你应该可以使用

git commit -m $'first line\nsecond line'
Run Code Online (Sandbox Code Playgroud)

Bash手册:

$' string ' 形式的单词是专门处理的.单词扩展为 字符串,替换为ANSI C标准指定的反斜杠转义字符.

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

  • $是关键,我最初没有注意到它.否则我只是在我的消息中间得到一个\n. (2认同)
  • 您甚至不必使用 $'...' 来表示整个字符串;在换行符周围使用它会起作用:`git commit -m“第一行”$'\n'“第二行”`。请注意,在开始“$'string'”之前,您必须关闭前一个字符串。 (2认同)

Jon*_*ell 87

在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."
Run Code Online (Sandbox Code Playgroud)

然后验证你做了什么:

git log -1
Run Code Online (Sandbox Code Playgroud)

你应该得到这样的东西:

PowerShell中的多行Git提交消息

截图来自我使用PowerShell和Poshgit设置的示例.

  • 很棒的答案.我多年来一直在寻找这个,并尝试了许多不同的方式来格式化我的Git提交消息,但这是最好的.我可以通过Git 1.8.2.1确认它是否有效. (7认同)
  • 这*应该*是选择的答案,因为它是最兼容的方法,这不像其他一些建议那样依赖于任何特定的 CLI 提示。 (3认同)
  • 它在**Git Bash for Windows**中对我很有用. (2认同)

Pet*_*mer 44

做点什么

git commit -m"test\ntest"
Run Code Online (Sandbox Code Playgroud)

不起作用,但有点像

git commit -m"$(echo -e "test\ntest")"
Run Code Online (Sandbox Code Playgroud)

有效,但不是很漂亮.你git-commitlb在你的设置命令PATH做了这样的事情:

#!/bin/bash

message=$1

git commit -m"$(echo -e "$message")"
Run Code Online (Sandbox Code Playgroud)

并像这样使用它:

git commitlb "line1\nline2\nline3"
Run Code Online (Sandbox Code Playgroud)

警告的话,我有一种感觉,即一般惯例是将摘要行作为第一行,然后是两个换行符,然后是提交消息中的扩展消息,因此这样做会破坏该约定.你当然可以这样做:

git commitlb "line1\n\nline2\nline3"
Run Code Online (Sandbox Code Playgroud)

  • +1这是让我沿着这条路走下去的一般惯例.谢谢 (8认同)

Sar*_*n M 37

Git文档:

-m <msg>
--message = <msg>
使用给定的<msg>作为提交消息.如果-m给出了多个选项,则它们的值将作为单独的段落连接在一起.

所以,如果你正在寻找分组多个提交消息,这应该做的工作:

git commit -m "commit message1" -m "commit message2"
Run Code Online (Sandbox Code Playgroud)

  • 不可知的解决方案(与外壳无关)。谢谢你。我们需要 RTFM :) (2认同)

Tob*_*bse 35

我希望这不会过于远离发布的问题,而是设置默认编辑器然后使用

git commit -e
Run Code Online (Sandbox Code Playgroud)

可能会更舒服.

  • 你可以放弃`-e`它仍然可以打开编辑器 (3认同)
  • 这应该是最好的anwser。 (2认同)

blo*_*gho 23

没有必要使这些东西复杂化.-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 ...
Run Code Online (Sandbox Code Playgroud)

  • 我现在有了使用 gitbash 的新理由。之前,它仅支持表情符号 (5认同)
  • @DRP,使用 [GitBash for Windows](https://git-scm.com/downloads)。我使用 Windows 计算机,在使用 GitBash for Windows 时效果非常好 (2认同)

Abi*_*ern 18

我在Mac上使用zsh,我可以在双引号(")中发布多行提交消息.基本上我一直在键入并按回新行,但是在我关闭引号并返回之前,消息不会发送到Git .

  • 你可以在bash中做同样的事情. (7认同)

Eug*_*ash 11

在Bash/Zsh中,您只需在引号内使用文字换行符:

git commit -m 'Multi-line
commit
message'
Run Code Online (Sandbox Code Playgroud)

ANSI-C引用也适用于Bash/Zsh:

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

您还可以指示Git使用不同的编辑器.从git-commit上的文档:

用于编辑提交日志消息的编辑器将从 GIT_EDITOR环境变量,core.editor配置变量,VISUAL环境变量或EDITOR 环境变量(按此顺序)中选择.有关详细信息,请参阅git-var.


Bas*_*asj 6

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

  • 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可能是最好的选择。


amp*_*ent 5

就我个人而言,我发现在事实发生之后vi(或您选择的git编辑器选择什么)而不是在命令行中进行修改,最简单的方法是在git commit --amendafter之后执行git commit

  • 您可以仅通过使用`git commit -e`来进行修改而无需修改即可达到相同的结果。 (5认同)
  • 或简单地`git commit`,它将打开带有提交消息模板的编辑器。 (3认同)

Ale*_*-A. 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'
Run Code Online (Sandbox Code Playgroud)

  • 这非常有用,我简直不敢相信我过去的几年没有这个。 (2认同)