如何在Windows上设置编辑器以使用Git?

Pat*_*ney 545 windows git cygwin editor

在Windows上试用Git.我到了尝试"git commit"的地步,我收到了这个错误:

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

所以我想出了我需要一个名为EDITOR的环境变量.没问题.我把它设置为指向记事本.这几乎奏效了.默认提交消息将在记事本中打开.但记事本不支持裸线馈送.我出去拿了Notepad ++,但是我无法弄清楚如何将Notepad ++设置为%EDITOR%以这样的方式使它与Git一起工作.

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

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

Von*_*onC 549

2015年9月更新(6年后)

git-for-Windows最后一个版本(2.5.3)现在包括:

通过配置git config core.editor notepad,用户现在可以notepad.exe将其用作默认编辑器.
配置git config format.commitMessageColumns 72将由记事本包装器选取,并在用户编辑后对提交消息进行换行.

提交69b301b约翰内斯Schindelin( )dscho.

并且Git 2.16(2018年第一季度)将显示一条消息,告诉用户在生成编辑器时它正在等待用户完成编辑,以防编辑器打开隐藏窗口或某处隐藏并且用户迷路.

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

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

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

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


原始答案

我刚用git版本1.6.2.msysgit.0.186.gf7512和Notepad ++ 5.3.1进行了测试

我更喜欢不必设置EDITOR变量,所以我试过:

git config --global core.editor "\"c:\Program Files\Notepad++\notepad++.exe\""
# or
git config --global core.editor "\"c:\Program Files\Notepad++\notepad++.exe\" %*"
Run Code Online (Sandbox Code Playgroud)

总是给出:

C:\prog\git>git config --global --edit
"c:\Program Files\Notepad++\notepad++.exe" %*: c:\Program Files\Notepad++\notepad++.exe: command not found
error: There was a problem with the editor '"c:\Program Files\Notepad++\notepad++.exe" %*'.
Run Code Online (Sandbox Code Playgroud)

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

"c:\Program Files\Notepad++\notepad++.exe" %*
Run Code Online (Sandbox Code Playgroud)

我键入:

C:\prog\git>git config --global core.editor C:\prog\git\npp.bat
Run Code Online (Sandbox Code Playgroud)

它只适用于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"
Run Code Online (Sandbox Code Playgroud)

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

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

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


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

那么工作是什么:

C:\prog\git>git config --global core.editor C:/prog/git/npp.bat
Run Code Online (Sandbox Code Playgroud)

C:/prog/git/npp.bat:

#!/bin/sh
"c:/Program Files/Notepad++/notepad++.exe" -multiInst "$*"
Run Code Online (Sandbox Code Playgroud)

要么

#!/bin/sh
"c:/Program Files/Notepad++/notepad++.exe" -multiInst -notabbar -nosession -noPlugin "$*"
Run Code Online (Sandbox Code Playgroud)

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

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

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


也可以看看:


lightfire228 在评论中添加:

对于任何有问题的人,N ++只打开一个空白文件,而git不接受你的提交消息,请参阅" 由于空消息而中止提交 ":更改你的文件.bat.sh说:

"<path-to-n++" .git/COMMIT_EDITMSG -<arguments>. 
Run Code Online (Sandbox Code Playgroud)

这将告诉notepad ++打开临时提交文件,而不是一个空白的新文件.

  • @NateGlenn使用缩写的`dir/X`等效:"`PROGRA~2`"用于"`Program Files(x86)`",这是在Windows上使用跨平台兼容工具时的一个好习惯,它允许你要压缩空白. (6认同)

Ben*_*wee 288

基于Darren的回答,使用Notepad ++你可以简单地做到这一点(所有在一行):

C:/Program Files/Notepad++/notepad++.exe

显然,该C:/Program Files (x86)/Notepad++/notepad++.exe部分应该是系统上Notepad ++可执行文件的路径.例如,它可能是C:/Program Files/Notepad++/notepad++.exe.

对我来说就像一个魅力.

  • 注意Notepad ++位于`C:\ Program Files(x86)\` (22认同)
  • @WilsonF原因是你必须退出notepad ++ for git才能停止等待输入并继续.你不希望*在这个Notepad ++实例中打开其他标签,因为那时你的git会话似乎被冻结了!这些设置完全正确:如果你已经打开Notepad ++,你会得到一个新的实例,它不允许你打开其他文件,并且必须在完成时关闭,以便git知道你已经完成了编辑.对提交消息的工作方式相同. (11认同)
  • 我也是!顺便说一下,这些开关在C:/ Program Files/Notepad ++/user.manual/documentation/notepad-user-manual/command-line.html中有解释. (10认同)
  • 对于x64 Windows更改为:git config --global core.editor"'C:/ Program Files(x86)/ Notepad ++/notepad ++.exe'-multiInst -notabbar -nosession -noPlugin" (8认同)
  • 我意识到我参加这个派对已经迟到了,但出于好奇,有人知道(甚至记得,经过这么多年)为什么会指定"-notabbar"?我理解其他参数背后的原因(好吧,不确定为什么"-noPlugin",实际上),但不是这个. (4认同)
  • 使用此配置,在使用git进行提交后,下次使用notepad ++时,标签栏已被隐藏.至少就是notepad ++ v5.7和git v1.7.11的情况.要在记事本++中修复它,我必须进行设置 - >首选项 - >常规 - >标签栏 - >隐藏取消选中. (2认同)
  • @ValentinTihomirov PS你单引用程序名称,因为`Program Files`中有一个空格. (2认同)
  • Notepad ++现在具有64位版本,因此不再位于c:\ Program Files(x86)中。对于Notepad ++的64位版本,正确的命令是:“ git config --global core.editor”'C:/ Program Files / Notepad ++ / notepad ++。exe'-multiInst -notabbar -nosession -noPlugin“ (2认同)

Dar*_*hop 50

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

git config --global core.editor "'C:/Program Files/TextPad 5/TextPad.exe' -m"
Run Code Online (Sandbox Code Playgroud)

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

另一方面,Cygwin(我认为是Git的Bash的底层平台)喜欢'"; 您可以使用/而不是指定类似CMD的路径,\只要引用该字符串即在此实例中使用单引号.

-m重写/指示使用多个编辑器,并没有必要为一个%*上涨的结束.

  • `git config --global core.editor''C:\ Program Files\Sublime Text 3\sublime_text.exe'-m"`对我来说就像一个魅力. (3认同)

Nic*_*son 26

编辑:更新到vim 7.3后,我得出的结论是,最干净,最简单的方法是:

  1. 将Vim的主文件夹添加到路径中(右键单击"我的电脑" - >"属性" - >"高级" - >"环境变量")

  2. 运行这个:__CODE__

如果你这样做,那么我相信它也适用于cygwin.

原始答案:

即使有几个与vim相关的答案,我也无法在Windows下使用gvim(而不使用批处理文件或%EDITOR%或cygwin).

我最终得到的是干净整洁,并从这里的一些解决方案中得出:

git config --global core.editor "gvim --nofork '%*'"
Run Code Online (Sandbox Code Playgroud)

让我筋疲力尽的一个问题是这些不是Windows风格的反斜杠,它们是正常的正斜杠.


Pat*_*yer 15

Notepad ++工作得很好,虽然我选择坚持使用记事本,-m,甚至有时内置"编辑".

您使用Notepad ++遇到的问题与git如何启动编辑器可执行文件有关.我的解决方案是将EDITOR设置为批处理文件,而不是实际的编辑器可执行文件,它执行以下操作:

start /WAIT "E:\PortableApps\Notepad++Portable\Notepad++Portable.exe" %*
Run Code Online (Sandbox Code Playgroud)

/ WAIT告诉命令行会话暂停,直到应用程序退出,因此您可以编辑到您的内容,而git愉快地等待着您.%*将批处理文件的所有参数传递到Notepad ++.

C:\src> echo %EDITOR%
C:\tools\runeditor.bat
Run Code Online (Sandbox Code Playgroud)


Gav*_*vin 11

写字板!

我很高兴使用vim,但是因为我想向公司介绍Git我想要的东西我们都有,并且发现Wordpad似乎工作正常(即Git确实等到你完成编辑和关闭窗户).

git config core.editor '"C:\Program Files\Windows NT\Accessories\wordpad.exe"'
Run Code Online (Sandbox Code Playgroud)

那是在msysgit上使用Git Bash; 我没有尝试从Windows命令提示符(如果这有任何区别).

  • 报价不正确.您必须将**双引号放在单引号**之外.也就是说,使用"'C:\ Program Files\Windows NT\Accessories\wordpad.exe'",它将工作. (3认同)

Tim*_*gan 9

我也在Windows上使用Cygwin,但是git_editor.bat(与基于终端的相反"C:/Program Files/Vim/vim72/gvim.exe" --nofork "%*").

为了完成这项工作,我做了以下工作:

  1. 创建了一个单行批处理文件(名为git_editor.bat),其中包含以下内容:
    PATH
  2. 放在GIT_EDITOR=git_editor.bat我的git commit.
  3. --nofork

完成此操作后git_editor.bat,等将正确调用gvim可执行文件.

注1:"C:/Program Files/Vim/vim72/gvim.exe" --nofork "%*"gvim 的选项确保它在写入提交消息之前就会阻塞.

注意2:如果路径中有空格,则需要gvim路径周围的引号.

注3:如果git传递带空格的文件路径,则需要"%*"周围的引号.


Edd*_*e B 8

感谢SO社区...并进行了一些研究,我得到了我最喜欢的编辑器 EditPadPro,作为msysgit 1.7.5.GIT和TortoiseGit v1.7.3.0在WinXP SP3上的核心编辑器......

按照上面的建议,我添加了代码编辑器的bash脚本的路径......

git config --global core.editor c:/msysgit/cmd/epp.sh
Run Code Online (Sandbox Code Playgroud)

然而,经过几次尝试上述解决方案失败后...我终于能够正常工作了.根据EditPadPro的文档,添加'/ newinstance'标志将允许shell等待编辑器输入....

' / newinstance '标志是我案例中的关键......

#!/bin/sh
"C:/Program Files/JGsoft/EditPadPro6/EditPadPro.exe" //newinstance "$*"
Run Code Online (Sandbox Code Playgroud)

  • 如果您具有EditPad Pro 7,并且想要从要等待EditPad进程等待的进程中调用EditPad Pro,则应该在EditPad的命令行上传递`/ wait`开关。您可以使用带有/不带有/ newinstance`的“ / wait”来控制是否应该打开一个新的EditPad窗口,或者是否应该重复使用一个现有的窗口。脚本启动的过程将等待文件关闭,而不管窗口是创建还是重用。EditPad Pro 6及更高版本不支持`/ wait`。 (2认同)

lam*_*cck 6

这是更大问题的一个症状.值得注意的是,你有一些设置TERM =哑.其他无法正常工作的TERM=dumb命令是说你没有一个功能齐全的终端.看起来这通常是由于将TERM设置为全局Windows环境变量中的某些内容而导致的.对我来说,当我安装Strawberry Perl的时候出现了一个问题,这个问题就在这个问题msysgit bug以及几个解决方案上.

第一个解决方案是通过添加以下内容将其修复到〜/ .bashrc中:

export TERM=msys
Run Code Online (Sandbox Code Playgroud)

您可以从Git BASH提示符执行此操作,如下所示:

echo "export TERM=msys" >> ~/.bashrc
Run Code Online (Sandbox Code Playgroud)

另一个解决方案最终是我所做的因为我不关心Strawberry Perl将TERM = dumb添加到我的环境设置的原因是按照msysgit错误报告中的评论指示删除TERM = dumb .

控制面板/系统/高级/环境变量...(或类似的,取决于您的Windows版本)是在Windows上设置粘性环境变量的位置.默认情况下,未设置TERM.如果在那里设置了TERM,那么您(或您安装的程序之一 - 例如Strawberry Perl)已经设置了它.删除该设置,你应该没事.

类似地,如果您使用Strawberry Perl并关心CPAN客户端或类似的东西,您可以less单独使用TERM=dumb并在〜/ .bashrc文件中使用,这与设置如上所述的明确术语具有类似的效果.

当然所有其他解决方案都是正确的,您可以使用它TERM=dumb来确保git在需要为您启动时使用您喜欢的编辑器.


小智 6

对于Atom,你可以做到

git config --global core.editor "atom --wait"
Run Code Online (Sandbox Code Playgroud)

和类似的VSCode

git config --global core.editor "code --wait"
Run Code Online (Sandbox Code Playgroud)

这将打开一个AtomVSCode窗口供您通过,

或者是Sublime

git config --global core.editor "subl -n -w"
Run Code Online (Sandbox Code Playgroud)


小智 6

在c:\ Users\YourUser文件夹中编辑.gitconfig文件并添加:

[core]
editor = 'C:\\Program files\\path\\to\\editor.exe'
Run Code Online (Sandbox Code Playgroud)


Mat*_*inn 5

Vim/Gvim对我很有用.

>echo %EDITOR%

c:\Vim\Vim71\vim.exe
Run Code Online (Sandbox Code Playgroud)


Who*_*ome 5

我让 PortableGit 1.6 工作正常,但在升级到 PortableGit 1.7 Windows 版本后,我遇到了问题。一些 Git 命令可以很好地打开 Notepad++.exe,但有些则不能,尤其是Git rebase 的行为不同。

问题是一些命令运行 Windows cmd 进程,而一些命令使用 Unix cmd 进程。我想为 Notepad++ 编辑器提供启动属性,所以我需要一个自定义脚本。我的解决办法是这样。

  1. 创建脚本以运行适当的文本编辑器。该脚本看起来很奇怪,但它同时处理 Windows 和 Unix 变体。

    c:/PortableGit/cmd/git-editor.bat

    #!/bin/sh
    # Open a new instance
    
    function doUnix() {
      "c:\program files\notepad++\notepad++.exe" -multiInst -nosession -notabbar $*
      exit
    }
    
    doUnix $*
    
    :WINCALL
    "c:\program files\notepad++\notepad++.exe" -multiInst -nosession -notabbar %*
    
    Run Code Online (Sandbox Code Playgroud)
  2. 设置全局 core.editor 变量

    脚本已保存到 git/cmd 文件夹,因此它已经在 gitconsole 路径中。这是强制性的,因为完整路径可能无法正常工作。

    git config --global core.editor "git-editor.bat"
    
    Run Code Online (Sandbox Code Playgroud)

现在我可以运行git commit -agit rebase -i master命令。如果您在 Git Windows 工具中遇到问题,请尝试一下。


Bil*_*ill 5

我在多个平台上使用 Git,而且我喜欢在所有平台上使用相同的 Git 设置。(事实上​​,我的所有配置文件都在 Git 的发布控制之下,并在每台机器上放置了一个 Git 存储库克隆。)我想出的解决方案是这样的:

我将我的编辑器设置为giteditor

git config --global core.editor giteditor
Run Code Online (Sandbox Code Playgroud)

然后我创建了一个名为giteditor的符号链接,它在我的PATH 中。(我有一个个人bin目录,但在PATH 中的任何地方都有效。)该链接指向我当前选择的编辑器。在不同的机器和不同的平台上,我使用不同的编辑器,所以这意味着我不必更改我的通用 Git 配置(.gitconfig),只需更改 giteditor指向的链接。

符号链接由我所知道的每个操作系统处理,尽管它们可能使用不同的命令。对于 Linux,您使用ln -s。对于 Windows,您使用cmd内置mklink。它们有不同的语法(你应该查一下),但它们的工作方式都是一样的,真​​的。


Dan*_*iel 5

根据VonC 的 建议,这对我有用(让我发疯):

git config --global core.editor "'C:/Program Files (x86)/Sublime Text 3/subl.exe' -wait"
Run Code Online (Sandbox Code Playgroud)

省略-wait可能会导致问题,尤其是当您使用Gerrit并更改必须手动复制到提交消息底部的 id 时。


JL_*_*_SO 5

我需要执行以下两项操作才能让 Git 在 Windows 中启动 Notepad++:

  • 将以下内容添加到 .gitconfig:

    editor = 'C:/Program Files/Notepad++/notepad++.exe' -multiInst -notabbar -nosession -noPlugin
    
    Run Code Online (Sandbox Code Playgroud)
  • 修改快捷方式以启动 Git Bash shell 以管理员身份运行,然后使用它来启动 Git Bash shell。我猜测上下文菜单条目“Git Bash here”没有以所需的权限启动 Notepad++。

做完以上两件事后,它起作用了。


Tal*_*ues 5

假设您想将VsCode配置为您的编辑器。请执行下列操作:

将以下行添加到您的.gitconfig文件中:

.gitconfig文件的默认位置是C:\Users\USER_NAME\.gitconfig

[core]
  editor = code -w -n
[diff]
  tool = vscode
[difftool "vscode"]
  cmd = code -w -n --diff $LOCAL $REMOTE
[merge]
  tool = vscode
[mergetool "vscode"]
  cmd = code -w -n $MERGED
Run Code Online (Sandbox Code Playgroud)

笔记:

  • -w是强制性的,并告诉您git等待vscode加载。
  • -n是可选的,告诉您在新窗口中git打开vscode 。

如果您想在 Windows 中配置编辑器的自定义路径:

您需要将该单词替换codeVsCode 的“.exe”路径

例如:

[core]
  editor = "'C:/Users/Tal/AppData/Local/Programs/Microsoft VS Code/Code.exe'" -w -n
[diff]
  tool = vscode
[difftool "vscode"]
  cmd = "'C:/Users/Tal/AppData/Local/Programs/Microsoft VS Code/Code.exe'" -w -n --diff $LOCAL $REMOTE
[merge]
  tool = vscode
[mergetool "vscode"]
  cmd = "'C:/Users/Tal/AppData/Local/Programs/Microsoft VS Code/Code.exe'" -w -n $MERGED
Run Code Online (Sandbox Code Playgroud)

笔记:

  • 您需要用单引号 将路径引起来''
  • 路径中的斜杠应该是正斜杠 /

或者另一个例子:

[core]
    editor = \"C:\\Users\\Tal\\AppData\\Local\\Programs\\Microsoft VS Code\\Code.exe\" -w -n

[diff]
    tool = vscode
[difftool "vscode"]
    cmd = \"C:\\Users\\Tal\\AppData\\Local\\Programs\\Microsoft VS Code\\Code.exe\" -w -n --diff $LOCAL $REMOTE

[merge]
    tool = vscode
[mergetool "vscode"]
    cmd = \"C:\\Users\\Tal\\AppData\\Local\\Programs\\Microsoft VS Code\\Code.exe\" -w -n $MERGED
Run Code Online (Sandbox Code Playgroud)

更新:

VsCode 现在支持“3 路合并”! 更新是在版本1.69.01.70.0中完成的。现在您可以启用 VsCode“mergetool”来查看 3 路合并。

为此,您需要更新该行:

[mergetool "vscode"]
      cmd = code -w -n $MERGED
Run Code Online (Sandbox Code Playgroud)

与新行:

[mergetool "vscode"]
      cmd = code -w -n --merge $REMOTE $LOCAL $BASE $MERGED
Run Code Online (Sandbox Code Playgroud)


归档时间:

查看次数:

302522 次

最近记录:

5 年,9 月 前