【问题标题】:How do I get COMMIT_EDITMSG to open from the correct location?如何让 COMMIT_EDITMSG 从正确的位置打开?
【发布时间】:2012-12-13 14:53:17
【问题描述】:

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

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

Aborting commit due to empty commit message.

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

我在this answer找到了一个线索,特别是这句话:

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

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

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

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

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

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

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

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

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

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

【问题讨论】:

  • 为了记录,/newinstance 是 EditPad Pro 使用的command line parameter启动应用程序可以等待的新 EditPad 实例。不同的编辑器有不同的方法来指定它。换句话说,这个参数是特定于编辑器而不是 Git。
  • 另请注意:在此上下文中需要双斜杠 (//newinstance)。如果没有它,EditPad Pro 会在现有实例中打开一个名为 newinstance 的空白文件。

标签: git mingw32


【解决方案1】:

$* 用于“所有其他参数”:参见“what does $* mean in a shell script

如果你忘记了$*

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

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

【讨论】:

    【解决方案2】:

    我不确定问题出在 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,它都应该可以工作。

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

    当编辑器用于其他目的(例如交互式变基)时,它没有帮助。最终解决方案见my other answer

    【讨论】:

      【解决方案3】:

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

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

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

      最终解决方案

      我对 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 脚本时,$* 的值是 $@ 而不是文件名,这导致编辑器打开一个名为 $@ 的空白文件。我以为我测试了这种组合,但显然没有。使用 两次引用 方法有效。

      【讨论】:

      • 优秀的反馈,比我的回答更完整。 +1
      • 谢谢。我花了很多时间和精力来弄清楚并写下来。自己解决这个问题是令人满意的,但被验证的感觉很好。更重要的是,你的投票为我赢得了一顶帽子。 :)
      • “Git R done”帽子...作为 Git 专家,我只能欣赏:这顶帽子适合你和这个问题。先生,我向你致敬。
      【解决方案4】:

      到目前为止,以下对我有用的提交:

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

      这会打开一个指向正确文件的新选项卡,并等待该选项卡关闭后再继续。添加了 --replace-all 以清除我之前尝试设置它时卡在其中的内容。

      【讨论】:

        【解决方案5】:

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

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

        git config --global core.editor "callEditor(){ filepath=\`echo \"\$*\" | tr '/' '\\' 2> /dev/null\`; '**PathToYourEditorHere**' \"\$filepath\"; }; callEditor"
        

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 2012-08-21
          • 2015-08-23
          • 1970-01-01
          • 2017-03-23
          • 2015-06-18
          • 2017-11-06
          • 1970-01-01
          • 1970-01-01
          相关资源
          最近更新 更多