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

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

How can I set up an editor to work with Git on Windows?

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

Terminal is dumb but no VISUAL nor
EDITOR defined. Please supply the
message using either -m or -F option.

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

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

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


2015年9月更新(6年后)

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

By configuring git config core.editor notepad, users can now use notepad.exe as their default editor.
Configuring git config format.commitMessageColumns 72 will be picked up by the notepad wrapper and line-wrap the commit message after the user edits it.

请参阅Johannes Schindelin(dscho)提交的69b301b。

并且Git 2.16(2018年第一季度)将显示一条消息,告诉用户在生成编辑器时它正在等待用户完成编辑,以防编辑器
打开一个隐藏的窗口或某个模糊的地方,用户得到
丢失。

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

launch_editor(): indicate that Git waits for user input

When a graphical GIT_EDITOR is spawned by a Git command that opens
and waits for user input (e.g."git rebase -i"), then the editor window
might be obscured by other windows.
The user might be left staring at
the original Git terminal window without even realizing that s/he needs
to interact with another window before Git can proceed. To this user Git
appears hanging.

Print a message that Git is waiting for editor input in the original
terminal and get rid of it when the editor returns, if the terminal
supports erasing the last line

原始答案

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

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

1
2
3
4
5
6
7
git config --global core.editor""c:\Program Files
otepad++
otepad++.exe""
# or
git config --global core.editor""c:\Program Files
otepad++
otepad++.exe" %*"

总是给出:

1
2
3
4
5
6
7
8
9
C:\prog\git>git config --global --edit
"c:\Program Files
otepad++
otepad++.exe" %*: c:\Program Files
otepad++
otepad++.exe: command not found
error: There was a problem with the editor '"c:\Program Files
otepad++
otepad++.exe" %*'.

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

1
2
3
"c:\Program Files
otepad++
otepad++.exe" %*

我键入:

1
2
C:\prog\git>git config --global core.editor C:\prog\git
pp.bat

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

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

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

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

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

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

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

那么工作是什么:

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

使用C:/prog/git/npp.bat

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

要么

1
2
#!/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。(将git\bin目录添加到PATH环境变量,但没有覆盖一些内置的Windows工具)

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

也可以看看:

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

lightfire228在评论中添加:

For anyone having an issue where N++ just opens a blank file, and git doesn't take your commit message, see"Aborting commit due to empty message": change your .bat or .sh file to say:

1
"<path-to-n++" .git/COMMIT_EDITMSG -.

That will tell notepad++ to open the temp commit file, rather than a blank new one.


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

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

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

对我来说就像一个魅力。


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

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

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

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

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


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

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

  • 运行:git config --global core.editor"gvim --nofork '%*'"

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

    原始答案:

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

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

    1
    2
    git config --global core.editor \
    "'C:/Program Files/Vim/vim72/gvim.exe' --nofork '%*'"

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


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

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

    1
    2
    3
    start /WAIT"E:\PortableApps
    otepad++Portable
    otepad++Portable.exe" %*

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

    1
    2
    3
    c:\src>echo %EDITOR%
    c:\tools
    uneditor.bat

    写字板!

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

    1
    git config core.editor '"C:\Program Files\Windows NT\Accessories\wordpad.exe"'

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


    我也在Windows上使用Cygwin,但使用gvim(而不是基于终端的vim)。

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

  • 创建了一行批处理文件(名为git_editor.bat),其中包含以下内容:
    "C:/Program Files/Vim/vim72/gvim.exe" --nofork"%*"
  • 在我的PATH中放置git_editor.bat
  • 设置GIT_EDITOR=git_editor.bat
  • 完成此操作后,git commit等将正确调用gvim可执行文件。

    注1:gvim的--nofork选项确保它在写入提交消息之前就会阻塞。

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

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


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

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

    1
    git config --global core.editor c:/msysgit/cmd/epp.sh

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

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

    1
    2
    #!/bin/sh
    "C:/Program Files/JGsoft/EditPadPro6/EditPadPro.exe" //newinstance"$*"

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

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

    1
    export TERM=msys

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

    1
    echo"export TERM=msys">> ~/.bashrc

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

    Control
    Panel/System/Advanced/Environment
    Variables... (or similar, depending on
    your version of Windows) is where
    sticky environment variables are set
    on Windows. By default, TERM is not
    set. If TERM is set in there, then you
    (or one of the programs you have
    installed - eg. Strawberry Perl) has
    set it. Delete that setting, and you
    should be fine.

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

    当然所有其他解决方案都是正确的,您可以使用git config --global core.editor $MYFAVORITEEDITOR来确保git在需要为您启动时使用您喜欢的编辑器。


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

    1
    2
    [core]
    editor = 'C:\\Program files\\path\\to\\editor.exe'

    对于Atom,你可以做到

    1
    git config --global core.editor"atom --wait"

    和类似的VSCode

    1
    git config --global core.editor"code --wait"

    这将打开一个Atom或VSCode窗口供您通过,

    或者是Sublime

    1
    git config --global core.editor"subl -n -w"

    Vim / Gvim对我很有用。

    1
    2
    3
    >echo %EDITOR%

    c:\Vim\Vim71\vim.exe

    我有PortableGit 1.6工作正常,但升级到PortableGit-1.7 Windows发布后出现问题。一些git命令打开Notepad ++ .exe很好,但有些没有,特别是git rebase的行为不同。

    问题是运行windows cmd进程的一些命令有些使用unix cmd进程。我想将启动属性赋予Notepad ++编辑器,因此需要有一个自定义脚本。我的解决方案是这个。

    1)创建脚本以运行适当的文本编辑器。脚本看起来很奇怪,但处理窗口和unix变化。
    C:/PortableGit/cmd/git-editor.bat

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    #!/bin/sh
    #open a new instance

    function doUnix() {
     "c:\program files
    otepad++
    otepad++.exe" -multiInst -nosession -notabbar $*
      exit
    }

    doUnix $*

    :WINCALL
    "c:\program files
    otepad++
    otepad++.exe" -multiInst -nosession -notabbar %*

    2)设置全局core.editor变量
    脚本已保存到git / cmd文件夹,因此它已经在gitconsole路径中,这是必需的,因为完整路径可能无法正常工作。

    1
    git config --global core.editor"git-editor.bat"

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


    我在多个平台上使用git,我喜欢在所有平台上使用相同的git设置。 (实际上,我使用git在发布控制下拥有所有配置文件,并在每台机器上放置一个git存储库克隆。)我提出的解决方案是:

    我把我的编辑设置为giteditor

    1
    git config --global core.editor giteditor

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

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


    基于上面的VonC建议,这对我有用(让我发疯):

    1
    git config --global core.editor"'C:/Program Files (x86)/Sublime Text 3/subl.exe' -wait"

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


    我在Windows上使用Cygwin,所以我使用:

    1
    export EDITOR="emacs -nw"

    -nw用于no-windows,即告诉Emacs不要尝试使用X11。

    Emacs键绑定对我来说不适用于Windows shell,因此我只能在Cygwin shell中使用它...(推荐rxvt。)


    这是我使用Geany作为git编辑器的设置:

    1
    git config --global core.editor C:/path/to/geany.bat

    在geany.bat中包含以下内容:

    1
    2
    #!/bin/sh
    "C:\Program Files\Geany\bin\Geany.exe" --new-instance"$*"

    它适用于DOS控制台和msysgit。


    我更喜欢使用emacs。设置它可能有点棘手。

  • 下载emacs并将其解压缩到c:\emacs之类的地方。
  • 运行c:\emacs\bin\addpm.exe。如果您使用的是Windows Vista或更高版本,则需要右键单击并"以管理员身份运行"。这会将可执行文件放在您的路径中。
  • .emacs文件中的某处添加(server-start)。有关放置.emacs文件的位置的建议,请参阅Emacs Windows常见问题解答。
  • git config --global core.editor emacsclientw
  • Git现在将在现有的emacs进程中打开文件。您必须从c:\emacs\bin
    unemacs.exe
    手动运行该现有流程。


    我很难让git与wordpad,KomodoEdit以及我给它的其他编辑器合作。最开放的是编辑,但git显然不会等待保存/关闭发生。

    作为一个拐杖,我一直在做

    1
    git commit -m"Fixed the LoadAll method"

    保持活力。倾向于让我的提交消息比它们应该的更短,但显然在Windows版本的git上还有一些工作要做。

    GitGUI也不是那么糟糕。这需要一点点的定位,但在那之后,它运作得相当好。


    我需要执行以下两项操作才能让git在windoze中启动notepad ++:

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

    1
    editor = 'C:/Program Files/Notepad++/notepad++.exe' -multiInst -notabbar -nosession -noPlugin

    - 修改启动git bash shell的快捷方式以管理员身份运行,然后使用它来启动git bash shell。我猜测上下文菜单条目"Git Bash here"没有启动具有所需权限的npp。

    完成上述两项工作后就可以了。


    这适用于Powershell和cmder-1.2(与powershell一起使用时)。在?/ .gitconfig中

    1
    2
    [core]
        editor = 'c:/program files/sublime text 3/subl.exe' -w

    如何让Sublime Text成为Git的默认编辑器?


    我设法通过使用引号和/设置EDITOR变量来使环境版本正常工作:

    1
    EDITOR="c:/Program Files (x86)/Notepad++/notepad++.exe"

    ATOM和Windows 10

  • 右键单击桌面上的Atom图标,然后单击属性。
  • 复制"开始"位置路径
  • 用windows explorer查看那里并找到"atom.exe"。
  • 在git bash中输入:

    git config --global core.editor C:/Users/YOURNAMEUSER/AppData/Local/atom/app-1.7.4/atom.exe"

  • 注意:我为/更改了所有\。我在我的主目录创建了一个.bashrc并使用/来设置我的主目录并且它工作正常,所以我假设/将是最佳选择。

    atom-editor git git-bash windows-10


    我刚遇到同样的问题并找到了不同的解决方案。我得到了

    1
    error: There was a problem with the editor 'ec'

    我有VISUAL=ec,并且在我的路径上有一个名为ec.bat的批处理文件,其中包含一行:

    1
    c:\emacs\emacs-23.1\bin\emacsclient.exe %*

    这让我可以使用ec 从命令行编辑文件,并且具有可视化设置意味着大多数unixy程序也会选择它。 Git似乎以不同于我的其他命令的方式搜索路径 - 当我在ProcMon中查看git commit时,我看到它在路径中的每个文件夹中查找ecec.exe,但不是ec.bat。我添加了另一个环境变量(GIT_EDITOR=ec.bat),一切都很好。


    我正在使用GitHub for Windows,这是一个不错的视觉选项。但我也更喜欢命令行,所以当我在Git shell中打开一个repo时它让它工作我只需设置以下内容:

    1
    git config --global core.editor vim

    这很棒。


    如果路径中有空格,似乎Git将找不到编辑器。因此,您必须将Patrick的答案中提到的批处理文件放入非空白路径中。


    恢复旧线程,但我发现了一个非常简单的解决方案 - 尽管在你必须复制作者给出的"subl"文件的路径中可能存在错误。我正在运行Win 7 x64,我不得不将"subl"文件放在我的/Git/cmd/文件夹中以使其工作。它虽然有点像魅力。


    这对我有用:

  • 将包含编辑器可执行文件的目录添加到PATH变量中。 (例如"C: Program Files Sublime Text 3")
  • 重新启动计算机。
  • 将core.editor全局git变量更改为编辑器可执行文件的名称,不带扩展名".exe"(例如git config --global core.editor sublime_text)
  • 而已!

    注意:Sublime Text 3是我用于此示例的编辑器。


    当使用远程安装的homedrive(samba share,nfs,...)时,~/.git文件夹是所有系统共享的acros,这可能会导致一些问题。因此,我更喜欢使用脚本来确定正确系统的正确编辑器:

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    #!/usr/bin/perl
    # Detect which system I'm on and choose the right editor
    $unamea = `uname -a`;
    if($unamea =~ /mingw/i){
        if($unamea =~ /devsystem/i){#Check hostname
            exec('C:\Program Files (x86)
    otepad++
    otepad++.exe', '-multiInst', '-nosession', @ARGV);
        }
        if($unamea =~ /testsystem/i){
            exec('C:\Program Files
    otepad++
    otepad++.exe', '-multiInst', '-nosession', @ARGV);
        }
    }
    $MCEDIT=`which mcedit`;
    if($MCEDIT =~ /mcedit/){
        exec($MCEDIT, @ARGV);
    }
    $NANO=`which nano`;
    if($NANO =~ /nano/){
        exec($NANO, @ARGV);
    }
    die"You don't have a suitable editor!
    ";

    有人可能会考虑使用普通的shell脚本,但我使用的是perl,因为perl随msysgit一起提供,而你的unixoid系统也会提供一个。
    将脚本放在/home/username/bin中,应将其添加到.bashrc.profile中的PATH。添加git config --global core.editor giteditor.pl后,无论身在何处,都可以使用正确的编辑器。


    这是Cygwin的解决方案:

    1
    2
    3
    4
    5
    6
    7
    #!/bin/dash -e
    if ["$1" ]
    then k=$(cygpath -w"$1")
    elif ["$#" != 0 ]
    then k=
    fi
    Notepad2 ${k+"$k"}
  • 如果没有路径,则不传递路径

  • 如果path为空,则传递空路径

  • 如果path不为空,请转换为Windows格式。

  • 然后我设置这些变量:

    1
    2
    export EDITOR=notepad2.sh
    export GIT_EDITOR='dash /usr/local/bin/notepad2.sh'
  • EDITOR允许脚本与Git一起使用

  • GIT_EDITOR允许脚本使用Hub命令

  • 资源


    这对我来说很有用,使用Cygwin和Textpad 6(编辑:只要你对脚本进行明显的改动,也可以使用Textpad 5),并且可能这个模型也可以用于其他编辑器:

    ?/的.gitconfig:

    1
    2
    [core]
        editor = ~/script/textpad.sh

    ?/脚本/ textpad.sh

    1
    2
    3
    4
    5
    6
    #!/bin/bash

    APP_PATH=`cygpath"c:/program files (x86)/textpad 6/textpad.exe"`
    FILE_PATH=`cygpath -w $1`

    "$APP_PATH" -m"$FILE_PATH"

    这个单线程也可以:

    ?/ script / textpad.sh(选项2):

    1
    "`cygpath"c:/program files (x86)/textpad 6/textpad.exe"`" -m"`cygpath -w $1`"

    我只是直接使用TortoiseGit。与我的PuTTY公钥完美集成。有一个完美的提交消息编辑器。


    推荐阅读