ChatGPT解决这个技术问题 Extra ChatGPT

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

我正在从命令行使用 Git,并试图在不进入 Vim 的情况下向提交消息添加换行符(使用 git commit -m "")。

这可能吗?

作为注释,这里有一个链接,它总结了良好的提交消息约定 - github.com/erlang/otp/wiki/Writing-good-commit-messages 如果它对某人有帮助。
GIT_EDITOR="emacs" git commit -m 'paragraph1' -m 'paragraph2' -e 之类的内容可以帮助您避免使用 vim

S
Sandra

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

git commit -m 'Message

goes
here'

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

git commit -F- <<EOF
Message

goes
here
EOF

@Peter Farmer 稍后的回答提到 Git 约定显然类似于:1 行摘要,两个换行符,然后是详细消息。
另外,请参阅@esse 的以下帖子。一个简单的回车就可以了。
@MohamadAli,在 Windows 上,命令行解析有效differently
@KelvinShadewing,是的,但区别在于外壳替换规则适用于消息,因此您需要转义美元符号和其他元字符。另一方面,它允许您使用变量。
@Nikhil,许多程序支持单个破折号作为文件名来表示标准输入或标准输出。使用 here documentgit 命令可以从标准输入读取消息文本,而 -F 选项提供用于读取消息的文件名。
S
Simon

如果你只想要一个标题行和一个内容行,你可以使用:

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

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

My head line

My content line.

这有一个在 Windows 上工作的好处,其中引用其他地方提到的技巧不起作用。为每一行分隔 -m。好的!
使用此方法创建的消息在 GitHub、GitHub for Windows 和 TortoiseGit 上正确显示。
@ddotsenko 这是在 Linux / Mac 上工作的好处,我们有一个不错的 shell =)
man git commit:-m <msg>, --message=<msg>使用给定的 <msg>作为提交消息。如果给出了多个 -m 选项,它们的值将连接为单独的段落。
请注意,这会创建单独的 paragraphs - 而不是行。所以每两个 -m 行之间会有一个空行。
P
Peter Mortensen

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

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

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


Abizern's answer 向我解释了为什么这样做 - Bash shell 解释了 <kbd>Enter</kbd>按键作为一个新行,直到第一个双引号字符被“关闭”(随后的双引号字符)。
我不得不同意,这是一个比公认的答案更有效、更简单、更实用的解决方案。使用 Git 1.8.2.1 对我来说效果很好。 +1 来自我。
这不是 Enter 键的特殊功能,而是与引号有关。使用双引号还是单引号并不重要,除了变量扩展和转义特殊字符 - 这就是我在回答中选择单引号的原因。
不要在 zsh 中使用它!终端将关闭,您会丢失输入的内容。
适用于 Windows 的 Gitbash。
J
Jon Crowell

在 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

你应该得到这样的结果:

https://i.stack.imgur.com/Pgvhm.png

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

这适用于所有终端和操作系统 AFAIK。

这是一个使用 bash 的示例:

https://i.stack.imgur.com/eRgFc.png

导致此提交:

https://i.stack.imgur.com/x7il3.png


很棒的答案。我已经为此寻找了很多年,并尝试了许多不同的方式来格式化我的 Git 提交消息,但这是最好的。我可以确认它在 Git 1.8.2.1 的提示下工作。
在 Powershell 中,您可以使用 `n 换行
它在适用于 Windows 的 Git Bash 中对我非常有用。
这应该是选择的答案,因为它是最兼容的方法,它不像其他一些建议那样依赖任何特定的 CLI 提示。
这是一个更好的答案,应该选择作为答案。这不仅作为默认行为符合要求,并且提供了更清晰的提交消息,而且使用多个 -m 更加灵活。此外,即使它看起来特定于 Windows 并吸引了与 Windows 相关的评论,它在 Linux 中也能正常工作。
D
Dennis Williamson

你应该可以使用

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

Bash manual

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

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


@rsy:你使用的是什么版本的 Bash?当您执行 echo $'one\ntwo' 时,您会看到什么?
rsy$ bash --version GNU bash, version 3.2.53(1)-release (x86_64-apple-darwin13) 版权所有 (C) 2007 Free Software Foundation, Inc. 该命令的输出如预期的那样以两种不同的形式显示线!
$ 是这里的关键,我乍一看并没有注意到它。否则我只会在我的消息中间得到一个 \n 。
您甚至不必为整个字符串使用 $'...';在换行符周围使用它会起作用:git commit -m "first line"$'\n'"second line"。请注意,您必须在开始 $'string' 之前关闭前一个字符串。
@PlasmaBinturong:没错,但对我来说,它看起来更混乱,并且更容易错过确保所有额外的引号都匹配。
b
blongho

没有必要使事情复杂化。在 -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 ...

[编辑 05-05-2021]

对于 Windows 用户,请使用 GitBash for Windows。内置 Windows cmd 不适用于此方法。


这个答案没有得到足够的爱!
这是一个很好的答案,新行在 Github 上正确显示。第一行显示为标题。
@DRP,使用 GitBash for Windows。我使用的是 Windows 计算机,这在使用 GitBash for Windows 时效果很好
我现在有了使用 gitbash 的新理由。以前,它只是为了表情符号支持🤣
刚刚在 PowerShell 7.2.2(在 Windows 终端)中测试了它,它的工作原理是一样的。在那种情况下,不需要适用于 Windows 的 GitBash。
P
Peter Mortensen

Git documentation

-m --message= 使用给定的 作为提交消息。如果给出了多个 -m 选项,它们的值将连接为单独的段落。

因此,如果您正在寻找对多个提交消息进行分组,这应该可以完成工作:

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

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

我希望这不会离发布的问题太远,但是 setting the default editor 然后使用

git commit -e

可能会舒服得多。


这应该是最好的答案。
您可以离开 -e,它仍然会打开编辑器
这就是我一直在寻找的答案。
P
Peter Mortensen

做类似的事情

git commit -m"test\ntest"

不起作用,但类似

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

工作,但它不是很漂亮。您在 PATH 中设置了一个 git-commitlb 命令,它执行以下操作:

#!/bin/bash

message=$1

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

并像这样使用它:

git commitlb "line1\nline2\nline3"

警告的话,我有一种感觉,一般约定是在第一行有一个摘要行,然后是两个换行符,然后是提交消息中的一个扩展消息,所以这样做会打破这个约定。你当然可以这样做:

git commitlb "line1\n\nline2\nline3"

E
Eugene Yarmash

在 Bash/Zsh 中,您可以简单地在引号内使用文字换行符:

git commit -m 'Multi-line
commit
message'

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

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

您还可以指示 Git 使用您选择的编辑器来编辑提交消息。来自 git-commit 上的文档:

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

例如,要使用 nano 编辑您的消息,您可以运行:

export GIT_EDITOR=nano
git commit

P
Peter Mortensen

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


你可以在 bash 中做同样的事情。
P
Peter Mortensen

如果你使用 Bash,点击 C-x C-e (Ctrl+x Ctrl+e),它会在您喜欢的编辑器中打开当前命令。

您可以通过调整 VISUALEDITOR 来更改首选编辑器。

这就是我的 .bashrc 中的内容:

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

那么为什么有人对此投反对票?这是在 bash 中使用多行命令最方便的方法,您只需正确配置一次。我一直在使用此处其他答案中显示的其他愚蠢建议,但是一旦您学会在自己喜欢的文本编辑器中编辑命令,就没有回头路了。
这非常有用,我简直不敢相信我过去几年没有这个。
B
Basj

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

git commit -m 'Hello Enter 不起作用:它不会要求换行

git commit -m "你好输入同上

git commit -m "你好^输入同上

git commit -m 'Hello^ Enter World' 看起来像工作,因为它询问“更多?”并允许写一个新行,但最后在做 git log 你会看到它仍然是一个单行消息......

TL;DR:即使在 Windows 上,命令行解析工作 differently,并且 ^ 允许多行输入,它在这里也无济于事。

最后,git commit -e 可能是最好的选择。


a
amphibient

就个人而言,我发现在 vi(或您选择的任何 git 编辑器)中而不是在命令行中修改提交消息最简单,方法是在 git commit 之后立即执行 git commit --amend


您只需使用 git commit -e 即可获得相同的结果而无需修改。
或者只是 git commit,它将打开一个带有提交消息模板的编辑器。
R
Rodrigo Graça

我没有看到有人提到如果您不提供消息,它将为您打开 nano(至少在 Linux 中),您可以在其中编写多行...

只需要这个:

git commit

o
oliver

可悲的是,git 似乎不允许在其消息中使用任何换行符。上面已经有各种合理的解决方案,但是在编写脚本时,这些很烦人。这里的文档也可以工作,但处理起来也可能有点烦人(想想 yaml 文件)

这是我所做的:

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

虽然这仍然很丑陋,但它允许“单行”可能仍然有用。由于通常字符串是变量或与变量组合,因此可以将丑陋保持在最低限度。


IMO 这将是一个奇妙而优雅的解决方案,但在 Cygwin 3.3.3 上它不起作用。
m
maciejwww

我一直在寻找该问题的任何答案,因为我曾经多次看到 regexes 来检查 commit 消息。无论如何,在使用 -m 标志创建提交期间没有任何想法。

https://i.stack.imgur.com/m2JZU.png

不需要更复杂的方法。


Y
Yug Singh

IMO 初始提交消息行应该是简短的,而不是段落。所以使用 git commit -m "<short_message>" 就足够了

之后,为了扩展初始提交消息,我们可以使用

git commit --amend

这将打开 vim,然后我们可以输入提交消息的解释,在我看来这比命令行更容易。