我是GIT的新手。我几天前从GitHub链接下载了GIT for Windows。我正在使用命令行工具 MinGW32 。我对默认编辑器不满意,所以我一直在尝试设置我最喜欢的编辑器。
我按照说明here使用了 EditPad Pro作为我的编辑器。但我不断收到以下消息:
Aborting commit due to empty commit message.
EditPad Pro会打开一个新实例。 MinGW32正在等待,因为在关闭EditPad Pro之前我没有收到中止消息。编辑器打开后,将打开一个名为COMMIT_EDITMSG
的空白文件。当我关闭编辑器时,文件将保存到目录的主目录中。
我在this answer中找到了一条线索,特别是这句话:
[Vim]默认将文件保存到.git / COMMIT_EDITMSG
如果我在关闭编辑器之前执行另存为将文件保存到.git目录,那么它可以正常工作。但是,有两个问题:
core.editor
的当前配置设置为:
"'D:\Program Files\JGsoft\EditPadPro5\EditPad Pro.exe' //newinstance"
我不确定说明中提到的$*
是什么用,但我尝试使用和不使用它,以及使用和不使用单/双引号的各种变体。我也尝试在shell脚本中设置值。在最坏的情况下,它根本不起作用(例如,甚至不会打开编辑器),最多只会打开一个空白文件。
如何使用Git在.git目录中创建的文件打开我的编辑器?
编辑:无论是否使用$*
,我都会得到完全相同的结果,而this answer表示不需要它。 {3}}在解释如何设置外部合并和差异工具时提到它,但在解释core.editor
配置设置时没有提及它。注意:我还尝试了%*
。
如果需要(并且缺少)$*
变量,我认为EditPad Pro将打开一个空白的 Untitled 文件,而不是当前目录中的空白COMMIT_EDITMSG文件。问题似乎是路径。
编辑:我做了更多的实验。我的文件路径中有空格,我认为这可能会导致问题。我将我的repo克隆到一个新目录中,名称中没有空格并修复了我的配置变量。它没有解决问题。但我注意到另一个问题。在我的一些测试中,加载到编辑器中的空白文件名为$@
。
答案 0 :(得分:5)
有几个问题可能导致混淆和问题。
Shell特殊变量
如果core.editor
设置为编辑器路径和文件名,则$*
变量是多余的,不。但是,如果将core.editor
设置为shell脚本,则必须将$*
变量传递给编辑器。
这是有效的:
$ git config --global core.editor "'D:/Path To/EditPadPro.exe' //newinstance"
这也是有效的:
$ git config --global core.editor "'E:/Path To/editor.sh'"
当editor.sh包含:
时#!/bin/sh
"D:/Path To/EditPadPro.exe" //newinstance "$*"
文件名中的空格
带空格的文件名可能很痛苦。如果引用路径/文件名,那么它通常不是问题。但是,当设置core.editor
的值时,您必须
逃离这样的空间:
"E:/Path\ To/editor.sh"
或者像这样引用两次:
"'E:/Path To/editor.sh'"
如果没有额外的引号(或反斜杠转义),设置值就没有问题了,但是当它被使用时会失败,因为外引号不是值的一部分。
编辑:后期方法(引用两次)似乎更安全。有关详细说明,请参阅底部的编辑。
Windows路径分隔符
传递给编辑器的文件名可以是相对路径(即.git / COMMIT_EDITMSG)或绝对路径(即e:/ path to / .git / rebase-merge / git-rebase-todo),但是在这两种情况下,它都使用正斜杠作为路径分隔符。 Windows通常可以接受正斜杠作为路径分隔符,尤其是在引用路径时。也许较旧版本的EditPad Pro 无法接受正斜杠与隐藏目录的组合。一点预处理可以解决这个问题。
注意:带正斜杠和无隐藏目录的硬编码路径似乎工作正常。带有隐藏目录和反斜杠的硬编码路径似乎工作正常。
我对shell脚本没有太多经验,但以下内容现在适用于我。
editor.sh文件包含:
#!/bin/sh
fullpath=`echo "$*" | tr '/' '\\\'`
"D:/Program Files/JGsoft/EditPadPro5/EditPadPro.exe" //newinstance "$fullpath"
并且配置如下:
$ git config --global core.editor "'E:/Path To/editor.sh'"
我的EditPad Pro 5.3.2副本现在打开时已经加载了正确的文件,无论git命令是什么启动编辑器。
编辑:我必须更改core.editor
的值。我使用反斜杠来转义路径中的空格,这正确地打开了编辑器。但是,当一个GIt命令将带有相对路径(以点开头)的fielname传递给我的shell脚本时,$*
的值是 $ @ 而不是文件名,这导致了编辑器打开一个名为 $ @ 的空白文件。我以为我测试了那个组合,但显然没有。使用引用两次方法可以正常工作。
答案 1 :(得分:2)
$*
用于“所有其他参数”:请参阅“what does $*
mean in a shell script”
如果您忘记了$*
:
"C:/Program Files/JGsoft/EditPadPro6/EditPadPro.exe" //newinstance "$*"
,您不会使用.git/COMMIT_EDITMSG
的最终参数打开编辑器
这意味着你不会通过dfault保存它应该保存的提交消息(git使用它)。
答案 2 :(得分:1)
我不确定EditPad Pro或MinGW32是否存在问题,但我找到了解决方法。如果我传入路径和文件名,它就可以工作。
例如:
$ git config --global core.editor "'D:/Program Files/JGsoft/EditPadPro5/EditPadPro.exe' //newinstance '.git\COMMIT_EDITMSG'"
EditPad Pro将打开两个文件:当前目录中的空白COMMIT_EDITMSG和.git目录中的COMMIT_EDITMSG。我可以编辑.git并保存它。当我关闭编辑器时,.git将用作提交消息。空白的一个不保存在任何地方,完全被忽略。
'.git\COMMIT_EDITMSG'
中的反斜杠和单引号非常重要。它不会以任何其他方式工作。起初我想也许我的旧版EditPad Pro不喜欢正斜杠,但我可以使用路径中的正斜杠(带或不带引号)传入其他文件名,它适用于它们。我只能猜测COMMIT_EDITMSG的任何其他变体都与MinGW32已传入的内容相冲突。
由于路径是相对于当前目录的,因此无论我提交哪个仓库,它都应该有效。
当编辑器用于其他目的(例如交互式rebase)时,它没有帮助。有关最终解决方案,请参阅my other answer。
答案 3 :(得分:0)
以下对我来说对提交有效:
$ git config --global core.editor "'C:/Program Files/Just Great Software/EditPad Pro 7/EditPadPro7.exe' '//wait'" --replace-all
这将打开一个指向正确文件的新选项卡,并在继续之前等待该选项卡关闭。添加了 - replace-all 以清除我之前尝试设置它的东西。
答案 4 :(得分:0)
所选答案中的解决方案非常有用。
我想基于它分享一个单行版本:
git config --global core.editor "callEditor(){ filepath=\`echo \"\$*\" | tr '/' '\\' 2> /dev/null\`; '**PathToYourEditorHere**' \"\$filepath\"; }; callEditor"