我如何设置一个编辑器来在Windows上使用Git?

在Windows上尝试了Git 。 我到了尝试“git commit”的地步,我得到了这个错误:

终端是愚蠢的,但没有VISUAL和EDITOR定义。 请使用-m或-F选项提供消息。

所以我想通了,我需要一个名为EDITOR的环境变量。 没问题。 我将它设置为指向记事本。 这工作,差不多。 默认提交消息在记事本中打开。 但记事本不支持裸线提要。 我出去获得了Notepad ++,但我无法弄清楚如何将Notepad ++设置为%EDITOR% ,这样可以像预期的那样使用Git。

我没有和Notepad ++结婚。 在这一点上,我不介意使用什么编辑器。 我只想在编辑器中输入提交消息,而不是在命令行中输入(使用-m )。

那些在Windows上使用Git的人:你用什么工具来编辑你的提交信息,你需要做些什么才能使它工作?


2015年9月更新(6年后)

git-for-Windows(2.5.3)的最新版本现在包括:

通过配置git config core.editor notepad ,用户现在可以使用notepad.exe作为其默认编辑器。
配置git config format.commitMessageColumns 72将被记事本包装器拾取并在用户编辑它之后将提交消息换行。

参见Johannes Schindelin( dscho )的commit 69b301b。

Git 2.16(Q1 2018)将会显示一条消息,告诉用户它正在等待用户在产生编辑器时完成编辑,以防编辑器打开到隐藏窗口或某处模糊并且用户迷路。

请参阅提交abfb04d(2017年12月7日),并提交由Lars Schneider( larsxschneider )提供的a64f213(2017年11月29日)。
帮助:Junio C gitstergitster )。
(由Junio C gitster合并 - gitster - in commit 0c69a13,2017年12月19日)

launch_editor() :表明Git等待用户输入

当图形GIT_EDITOR由打开并等待用户输入的Git命令产生时(例如“ git rebase -i ”),编辑器窗口可能会被其他窗口遮挡。
用户可能会留下盯着原始的Git终端窗口,甚至没有意识到他/她需要在Git继续之前与另一个窗口进行交互。 给这个用户Git挂起。

在编辑器返回时打印Git等待编辑器输入的消息,并在编辑器返回时删除它,如果终端支持擦除最后一行


原始答案

我只是用git版本1.6.2.msysgit.0.186.gf7512和Notepad ++ 5.3.1来测试它

我宁愿不必设置EDITOR变量,所以我尝试了:

git config --global core.editor ""c:Program FilesNotepad++notepad++.exe""
# or
git config --global core.editor ""c:Program FilesNotepad++notepad++.exe" %*"

这总是给:

C:proggit>git config --global --edit
"c:Program FilesNotepad++notepad++.exe" %*: c:Program FilesNotepad++notepad++.exe: command not found
error: There was a problem with the editor '"c:Program FilesNotepad++notepad++.exe" %*'.

如果我定义一个npp.bat包括:

"c:Program FilesNotepad++notepad++.exe" %*

我输入:

C:proggit>git config --global core.editor C:proggitnpp.bat

它只能在DOS会话中使用, 而不能在git shell中使用
(不是使用core.editor配置机制,其中带有“ start /WAIT... ”的脚本将不起作用,但只能打开一个新的DOS窗口)


Bennett的回答提到避免添加脚本的可能性,而是直接在简单引号之间引用程序本身。 注意斜线的方向! 使用/ NOT 来分隔路径名中的文件夹!

git config --global core.editor 
"'C:/Program Files/Notepad++/notepad++.exe' -multiInst -notabbar -nosession -noPlugin"

或者如果您使用的是64位系统:

git config --global core.editor 
"'C:/Program Files (x86)/Notepad++/notepad++.exe' -multiInst -notabbar -nosession -noPlugin"

但我更喜欢使用脚本(见下文):这样我可以使用不同的路径或不同的选项,而无需再次注册git config


实际的解决方案(用脚本)是要认识到:
你在配置文件中引用的内容实际上是一个shell( /bin/sh )脚本 ,而不是DOS脚本。

那么工作是什么:

C:proggit>git config --global core.editor C:/prog/git/npp.bat

C:/prog/git/npp.bat

#!/bin/sh
"c:/Program Files/Notepad++/notepad++.exe" -multiInst "$*"

要么

#!/bin/sh
"c:/Program Files/Notepad++/notepad++.exe" -multiInst -notabbar -nosession -noPlugin "$*"

使用该设置,我可以在DOS或Git Shell中执行' git config --global --edit ',或者我可以从DOS或Git Shell执行' git rebase -i ... '。
Bot命令将触发记事本++的新实例(因此是-multiInst选项),并在继续之前等待该实例关闭。

请注意,我只使用'/',而不是 '。 我使用选项2安装了msysgit。(将gitbin目录添加到PATH环境变量中,但不覆盖一些内置的Windows工具)

记事本++包装被称为.bat的事实并不重要。
最好将其命名为'npp.sh'并将其放在[git]cmd目录中(或者在您的PATH环境变量引用的任何目录中)。


也可以看看:

  • 如何用visual diff程序查看'git diff'输出? 为一般理论
  • 如何用msysgit / gitk设置DiffMerge? 作为外部工具的另一个例子(DiffMerge和WinMerge)

  • lightfire228在评论中补充道:

    对于任何有N ++只是打开一个空白文件而git没有提交提交消息的问题的人,请参阅“由于空消息而中止提交”:将.bat.sh文件更改为:

    "<path-to-n++" .git/COMMIT_EDITMSG -<arguments>. 
    

    这将告诉记事本++打开临时提交文件,而不是一个空白的新文件。


    在Darren的答案的基础上,使用Notepad ++,你可以简单地做到这一点(全部在一行上):

    在32位操作系统上: git config --global core.editor "'C:/Program Files/Notepad++/notepad++.exe' -multiInst -notabbar -nosession -noPlugin"

    在64位操作系统上git config --global core.editor "'C:/Program Files (x86)/Notepad++/notepad++.exe' -multiInst -notabbar -nosession -noPlugin"

    很明显, C:/Program Files/Notepad++/notepad++.exe部分应该是系统中Notepad ++可执行文件的路径。 例如,在Windows 7上,它可能是C:/Program Files (x86)/Notepad++/notepad++.exe 。 感谢评论者指出这一点。

    对我来说就像一个魅力。


    无论如何,我刚刚一直在玩这个,发现以下对我很好用:

    git config --global core.editor "'C:/Program Files/TextPad 5/TextPad.exe' -m"
    

    我不认为CMD喜欢单引号,所以你必须使用双引号“来指定嵌入空间的字符串参数”。

    另一方面,Cygwin(我认为它是Git的Bash的底层平台)喜欢'" ;你可以指定类似CMD的路径,使用/而不是 ,只要字符串被引用,即在这种情况下,使用单引号。

    -m覆盖/表示使用多个编辑器,并且不需要在最后添加%*

    链接地址: http://www.djcxy.com/p/21485.html

    上一篇: How can I set up an editor to work with Git on Windows?

    下一篇: WPF c# outlook sendEventHandler with parameters