在Git Bash for Windows中,`git commit -F -`命令中的“标准输入模式”有什么用处?

9

我理解以下命令会从标准输入中获取文本,并将其用作提交日志的消息:

echo "hello world" | git commit -F -

但是,如果您只使用git commit -F -,那么它会将您带到我所称的“标准输入模式”,其中Git Bash显示消息(reading log message from standard input)并等待某种输入...我猜。我的问题是这个模式实际上是什么,它能被使用吗?我使用ctrl-zctrl-c输入文本并退出,但在此之后没有成功运行提交。它只会让我回到提示符。

问题:在“标准输入模式”中实际上正在发生什么,并且是否可以成功输入提交日志信息?

编辑:我尝试了ctrl-d,但没有任何变化。我正在使用Windows 10。

3个回答

9
当你在命令中使用“-”时,它告诉应用程序从STDIN读取。Git注意到STDIN为空(除非你先echo并pipe),因此它开始等待输入。一旦你输入消息,你必须发送EOF消息告诉它你已经完成了。
当你运行echo hello | git commit -F -时,你将文本pipe到git中,所以它使用pipe的消息。
为了在Git Bash控制台的Windows上使用git commit -F -,你必须将命令附加到winpty中,如下所示:
winpty git commit -F -
之后,你将进入“标准输入模式”,如预期。与Linux和Mac不同,你不需要按CTRL + D ,而是按CTRL + Z,然后在新行上按ENTER。这将指示EOF并保存提交日志消息。
~ blockloop 如果您在与消息相同的行上按下 CTRL + Z,那么将会在消息旁边输入文本^Z,并且不会发生其他任何事情。您需要在单独的空行上先按下 CTRL + Z,然后再按下 ENTER
因此,要编辑blockloop的示例:
winpty git commit -F -
my message blah blah<enter>
<CTRL-Z><enter>

来源:Github


没问题!如果解释中有什么不清楚的地方,请告诉我,我会尽力澄清。 - user6312047

2

在输入消息后,请使用CTRL-D(EOF)进行结束。CTRL-C终止,CTRL-Z暂停。EOF告诉STDIN您的消息已完成。

git commit -F -
my message blah blah<enter>
<CTRL-D>

当你在命令中使用“-”时,它告诉应用程序从STDIN读取。Git注意到STDIN是空的(除非你先echo和pipe),所以它开始等待输入。一旦您键入消息,您必须发送“EOF”消息来告诉它您已完成。EOF的键组合是CTRL-D。
当你运行“echo hello | git commit -F -”时,你正在将文本导入git,因此它会使用管道消息。
出于好奇,为什么不使用“git commit -m 'your message here'”?

我尝试了,但没有成功。什么都没有改变。但是,感谢您的详细解释!唉...我还尝试了"\0"、"\n"和"\eof"。 - user6312047
1
一旦您输入了消息,按回车键换行,然后按CTRL-D。 - blockloop
你使用的是哪个操作系统? - blockloop
如果您正在使用 Git Bash,那么 CTRL-D 是 EOF,但是如果您正在使用 Powershell/CMD,则 CTRL-Z 是 EOF。尝试按照上面概述的过程,在新行上使用 CTRL-Z,看看是否有效。 - blockloop
好的,所以我再次尝试了CTRL-Z,然后我只收到一条消息说“已停止”,然后它会将我带回提示符。提交没有成功。我知道……这很奇怪。我很确定我在使用Git Bash。它在顶部显示MINGW64。 - user6312047
显示剩余2条评论

0

你可以尝试使用SHIFT+ESC,然后插入q并按Enter键。


不幸的是,这也没有起作用。我真的很好奇Git的人对此有何看法。 - user6312047

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接