如何从正确的位置打开COMMIT_EDITMSG?

时间:2012-12-28 10:05:54

标签: git mingw32

我是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目录,那么它可以正常工作。但是,有两个问题:

  1. 我必须记住另存为
  2. 我没有得到Git默认添加到COMMIT_EDITMSG
  3. 的有用评论

    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克隆到一个新目录中,名称中没有空格并修复了我的配置变量。它没有解决问题。但我注意到另一个问题。在我的一些测试中,加载到编辑器中的空白文件名为$@

5 个答案:

答案 0 :(得分:5)

有几个问题可能导致混淆和问题。

  1. 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 "$*"
    
  2. 文件名中的空格

    带空格的文件名可能很痛苦。如果引用路径/文件名,那么它通常不是问题。但是,当设置core.editor的值时,您必须

    逃离这样的空间:

    "E:/Path\ To/editor.sh"
    

    或者像这样引用两次:

    "'E:/Path To/editor.sh'"
    

    如果没有额外的引号(或反斜杠转义),设置值就没有问题了,但是当它被使用时会失败,因为外引号不是值的一部分。

    编辑:后期方法(引用两次)似乎更安全。有关详细说明,请参阅底部的编辑。

  3. Windows路径分隔符

    传递给编辑器的文件名可以是相对路径(即.git / COMMIT_EDITMSG)或绝对路径(即e:/ path to / .git / rebase-merge / git-rebase-todo),但是在这两种情况下,它都使用正斜杠作为路径分隔符。 Windows通常可以接受正斜杠作为路径分隔符,尤其是在引用路径时。也许较旧版本的EditPad Pro 无法接受正斜杠与隐藏目录的组合。一点预处理可以解决这个问题。

    注意:带正斜杠和隐藏目录的硬编码路径似乎工作正常。带有隐藏目录反斜杠的硬编码路径似乎工作正常。

  4. 最终解决方案

    我对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"