7

我是 GIT 的新手。几天前,我从 GitHub 链接下载了适用于 Windows 的 GIT。我正在使用命令行工具MinGW32。我对默认编辑器不满意,所以我一直在尝试设置我最喜欢的编辑器。

我按照此处的说明使用 EditPad Pro 作为我的编辑器。但我不断收到以下消息:

Aborting commit due to empty commit message.

EditPad Pro 打开一个新实例。MinGW32 正在等待,因为我在关闭 EditPad Pro 之后才收到中止消息。当编辑器打开时,它会打开一个名为COMMIT_EDITMSG. 当我关闭编辑器时,该文件将保存到 repo 的主目录中。

我在这个答案中找到了线索,特别是这句话:

[Vim] 默认将文件保存到 .git/COMMIT_EDITMSG

如果我在关闭编辑器之前执行另存为以将文件保存到 .git 目录,那么它可以工作。但是,这样做有两个问题:

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

当前的配置设置core.editor是:

"'D:\Program Files\JGsoft\EditPadPro5\EditPad Pro.exe' //newinstance"

我不确定说明中$*提到的内容是什么,但我尝试了有和没有那个以及有和没有单/双引号的各种变体。我也尝试在 shell 脚本中设置值。在最坏的情况下,它根本不起作用(例如,甚至不会打开编辑器),最好的情况是它打开一个空白文件。

如何让我的编辑器使用 Git 在 .git 目录中创建的文件打开?

编辑:无论我是否使用,我都会得到完全相同的结果$*这个答案说不需要。这个Git Pro页面在解释如何设置外部合并和差异工具时提到了它,但在解释core.editor配置设置时没有提到它。注意:我也试过%*.

如果$*需要该变量(并且缺少该变量),我认为 EditPad Pro 将打开一个空白的Untitled文件,而不是当前目录中的一个空白 COMMIT_EDITMSG 文件。问题似乎是路径。

编辑:我做了更多的实验。我的文件路径中有空格,我认为这可能会导致问题。我将我的 repo 克隆到一个名称中没有空格的新目录中,并修复了我的配置变量。它没有解决问题。但我注意到另一个问题。在我的一些测试中,加载到编辑器中的空白文件名为$@.

4

5 回答 5

6

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

  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无法接受正斜杠与隐藏目录的组合。一点预处理可以解决这个问题。

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

最终解决方案

我对 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 命令将一个带有相对路径(以点开头)的字段名传递给我的 shell 脚本时,值$*$@而不是文件名,这导致编辑器打开一个名为$@的空白文件。我以为我测试了这种组合,但显然没有。使用两次引用方法有效。

于 2012-12-29T11:44:16.277 回答
2

$*适用于“所有其他参数”:请参阅“ shell 脚本中的含义$*

如果你忘记$*了:

 "C:/Program Files/JGsoft/EditPadPro6/EditPadPro.exe" //newinstance "$*"

,您将不会使用最终参数打开编辑器,即.git/COMMIT_EDITMSG.
这意味着您不会将提交消息默认保存在应该保存的位置(供 git 使用)。

于 2012-12-28T12:51:30.330 回答
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 已经传入的内容相冲突。

由于路径是相对于当前目录的,因此无论我提交哪个 repo,它都应该工作。

编辑:上述解决方案仅适用于提交。

当编辑器用于其他目的(例如交互式变基)时,它没有帮助。有关最终解决方案,请参阅我的其他答案

于 2012-12-28T14:20:35.710 回答
0

到目前为止,以下内容适用于我的提交:

$ git config --global core.editor "'C:/Program Files/Just Great Software/EditPad Pro 7/EditPadPro7.exe' '//wait'" --replace-all

这将打开一个指向正确文件的新选项卡,并等待该选项卡关闭,然后再继续。添加--replace -all是为了清除我之前尝试设置它时卡在里面的东西。

于 2016-01-22T17:04:16.657 回答
0

所选答案中的解决方案非常有帮助。

我想分享一个基于它的单行版本:

git config --global core.editor "callEditor(){ filepath=\`echo \"\$*\" | tr '/' '\\' 2> /dev/null\`; '**PathToYourEditorHere**' \"\$filepath\"; }; callEditor"
于 2016-10-25T12:52:35.310 回答