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

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

终端是哑的,但没有视觉或 编辑器定义。请提供

.使用-m或-F选项

所以我发现我需要一个叫做EDITOR的环境变量。没有问题。我把它设置为指向记事本。这几乎奏效了。默认的提交消息在记事本中打开。但是记事本不支持换行。我出去得到了notepad++,但我不知道如何将notepad++设置为%EDITOR%,这样它就可以与Git正常工作。

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

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

392976 次浏览

我很难让Git与写字板科摩多编辑和几乎所有其他我给它的编辑器合作。大多数打开以供编辑,但Git显然不会等待保存/关闭发生。

作为拐杖,我一直在做。

git commit -m "Fixed the LoadAll method"

让事情继续发展。它往往会使我的提交消息比应该的要短一些,但显然在Windows版本的Git上还有一些工作要做。

GitGUI也不是那么糟糕。它需要一点定位,但在那之后,它工作得很好。

notepad++工作得很好,尽管我选择坚持使用Notepad, -m,有时甚至是内置的“编辑”。

您在使用notepad++时遇到的问题与Git如何启动编辑器可执行文件有关。我的解决方案是将环境变量EDITOR设置为一个批处理文件,而不是实际的编辑器可执行文件,执行以下操作:

start /WAIT "E:\PortableApps\Notepad++Portable\Notepad++Portable.exe" %*

/WAIT告诉命令行会话停止,直到应用程序退出,这样当Git愉快地等待您时,您将能够按照自己的意愿进行编辑。%*将批处理文件的所有参数传递给notepad++。

C:\src> echo %EDITOR%
C:\tools\runeditor.bat

Vim / gVim很适合我。

>echo %EDITOR%


c:\Vim\Vim71\vim.exe

如果路径中有空格,Git似乎无法找到编辑器。因此,您必须将帕特里克的回答中提到的批处理文件放到一个非空白路径中。

2015年9月更新(6年后)

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

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

参见提交69年b301b约翰内斯·辛德林(dscho)

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

参见提交abfb04d(2017年12月7日)和提交a64f213(2017年11月29日) 得益于:# EYZ1。< br > (由滨野朱尼奥——gitster——提交0 c69a13合并,2017年12月19日)

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

当图形化的GIT_EDITOR由打开的Git命令生成时 并等待用户输入(例如。“git rebase -i”),然后打开编辑器窗口 可能被其他窗口遮挡。
用户可能会盯着看 原来的Git终端窗口,甚至没有意识到她/他需要 在Git继续之前与另一个窗口交互。这个用户Git 似乎挂。< / p >

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


原来的答案

我刚刚用git版本1.6.2.msysgit.0.186测试了它。gf7512和notepad++ 5.3.1

我更喜欢设置一个编辑器变量,所以我尝试了:

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

它总是给出:

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" %*'.

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

"c:\Program Files\Notepad++\notepad++.exe" %*

然后我输入:

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

它只是从DOS会话工作,但不是从git外壳 (不是那个核心。编辑器配置机制,脚本中有“start /WAIT...”将无法工作,而只能打开一个新的DOS窗口)


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

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:\prog\git>git config --global core.editor C:/prog/git/npp.bat

与# EYZ0:

#!/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命令将触发一个notepad++的新实例(因此使用-multiInst'选项),并等待该实例关闭后才继续执行

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

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

参见:


lightfire228添加在评论中:

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

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

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

不管怎样,我只是在玩这个,发现下面的工作对我来说很好:

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

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

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

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

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

export EDITOR="emacs -nw"

-nw代表no-windows,也就是说,告诉Emacs不要尝试使用X窗口

Emacs键绑定不能从Windows shell中为我工作,所以我只会从Cygwin shell中使用这个…(建议使用rxvt。)

我只是遇到了同样的问题,却找到了不同的解决方案。我正在

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

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

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

这让我可以使用ec <filename>从命令行编辑文件,设置VISUAL意味着大多数unix程序也会选择它。Git搜索路径的方式似乎与我的其他命令不同——当我在过程监控中查看git commit时,我看到它在ecec.exe路径上的每个文件夹中都有查找,但没有查找ec.bat。我添加了另一个环境变量(GIT_EDITOR=ec.bat),一切正常。

达伦的回答的基础上,使用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

这对我来说很有魔力。

文章如何设置notepad++作为默认的Git编辑器提交而不是Vim解释了该命令的参数。

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

为了做到这一点,我做了以下工作:

  1. 创建一个单行批处理文件(命名为git_editor.bat),其中包含以下内容: 李# EYZ0 < / >
  2. git_editor.bat放在我的PATH中。
  3. 组# EYZ0

完成此操作后,git commit等将正确地调用gVim可执行文件。

注1:gVim的--nofork选项确保它会阻塞,直到提交消息被写入。

注2:如果路径中有空格,则必须在gVim路径周围加上引号。

注意3:“%*”周围的引号是必要的,以防Git传递一个带空格的文件路径。

我的PortableGit 1.6运行良好,但在升级到PortableGit 1.7 Windows版本后,我遇到了一些问题。有些Git命令可以打开notepad++ .exe,但有些不能,尤其是Git变基的行为就不同了。

问题是有些命令运行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 %*
    
  2. Set the global core.editor variable

    The script was saved to git/cmd folder, so it's already in a gitconsole path. This is mandatory as a full path may not work properly.

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

Now I can run the git commit -a and git rebase -i master commands. Give it a try if you have problems in the Git Windows tool.

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

  1. 下载Emacs并将其解压缩到c:\emacs这样的位置。
  2. # EYZ0运行。如果你使用windowsvista或以上版本,你需要右键点击“以管理员身份运行”。这将把可执行文件放到您的路径中。
  3. .emacs文件中添加(server-start)。在哪里放置.emacs文件的建议请参阅Emacs Windows常见问题
  4. # EYZ0

Git现在将在现有的Emacs进程中打开文件。您必须从c:\emacs\bin\runemacs.exe手动运行现有流程。

WordPad!

我很喜欢使用Vim,但由于我试图向公司介绍Git,所以我想要一些我们都拥有的东西,并且发现写字板似乎可以正常工作(即Git会等待您完成编辑并关闭窗口)。

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

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

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

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

geany.bat中添加以下内容:

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

它可以在DOS控制台和msysgit中工作。

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

  1. 添加Vim的主文件夹到您的路径(右键单击My Computer →< em > < / em >属性→< em > < / em >先进→< < em >环境变量/ em >)

  2. < p >运行:

    git config --global core.editor "gvim --nofork '%*'"
    

If you do it this way, then I am fairly sure it will work with Cygwin as well.

Original answer:

Even with a couple of Vim-related answers, I was having trouble getting this to work with gVim under Windows (while not using a batch file or %EDITOR% or Cygwin).

What I eventually arrived at is nice and clean, and draws from a few of the solutions here:

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

我花了一点时间才发现,这些不是windows风格的反斜杠。它们是正常的正斜杠。

我设法通过使用引号和/设置编辑器变量来获得环境版本:

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

这是更严重问题的一个症状。值得注意的是,您设置了TERM=dumb。其他不能正常工作的是less命令,它表示您没有一个功能完整的终端。

这似乎最常见的原因是将TERM设置为全局Windows环境变量中的某个值。对我来说,当我安装草莓Perl时出现了这个问题,关于这个的一些信息是在Msysgit bug来解决这个问题以及几个解决方案上。

第一个解决方案是在您的~/中修复它。Bashrc补充道:

export TERM=msys

你可以在Git Bash提示符中这样做:

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

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

< p >控制 面板/系统/高级/环境 变量……(或类似,取决于 你的Windows版本)在哪里 设置Sticky环境变量 在Windows上。默认情况下,TERM不是 集。如果TERM设置在这里,那么你 (或者你有一个程序 已安装-例如草莓Perl) 设置它。删除那个设置,还有你

类似地,如果您使用Strawberry Perl并且关心CPAN客户机或类似的东西,您可以不使用TERM=dumb,而在~/中使用unset TERM。Bashrc文件,它将具有类似于设置上面的显式术语的效果。

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

当使用远程挂载的主驱动器(Samba共享,NFS,…)时,您的~/.git文件夹在所有系统上共享,这可能会导致几个问题。因此,我更喜欢用脚本来确定正确系统的正确编辑器:

#!/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)\Notepad++\notepad++.exe', '-multiInst', '-nosession', @ARGV);
}
if($unamea =~ /testsystem/i){
exec('C:\Program Files\Notepad++\notepad++.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!\n";
有人可能会考虑一个普通的shell脚本,但我使用Perl,因为它是与msysgit一起提供的,您的类unix系统通常也会提供一个。 将脚本放在/home/username/bin中,应该添加到.bashrc.profile中的PATH中。一旦添加了git config --global core.editor giteditor.pl,你就有了正确的编辑器,无论你在哪里

感谢Stack Overflow社区…和一些研究,我能够得到我最喜欢的编辑器,< >强EditPad Pro < / >强,作为msysgit 1.7.5的核心编辑器。GIT和TortoiseGit v1.7.3.0在Windows 

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

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

然而,在对上述解决方案进行了几次失败的尝试后……我终于把它修好了。根据EditPad Pro的文档,添加'/newinstance'标志将允许shell等待编辑器输入…

在我的例子中,“/ newinstance”标志是关键……

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

我只是直接使用TortoiseGit。它与我的腻子公钥完美地集成在一起。

它有一个完美的提交消息编辑器。

这是为我使用Cygwin和文本编辑 6工作(编辑:它也与TextPad 5工作,只要你对脚本做出明显的改变),想必模型也可以用于其他编辑器:

文件# EYZ0:

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

文件# EYZ0:

#!/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):

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

我在多个平台上使用Git,并且我喜欢在所有平台上使用相同的Git设置。(事实上,我用Git对所有配置文件进行了发布控制,并在每台机器上放置了一个Git存储库克隆。)我想到的解决办法是:

我把编辑器设置为giteditor

git config --global core.editor giteditor

然后我在我的路径中创建一个名为giteditor的符号链接。(我有一个个人的箱子目录,但在路径中的任何地方都可以工作。)这个链接指向我现在选择的编辑。在不同的机器和平台上,我使用不同的编辑器,所以这意味着我不需要更改我的通用Git配置(.gitconfig),只需更改giteditor所指向的链接。

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

这招对我很管用:

  1. 将包含编辑器可执行文件的目录添加到< em >路径< / em >变量中。(例如# EYZ1)
  2. 重新启动计算机。
  3. core.editor全局Git变量更改为编辑器可执行文件没有扩展 . exe”的名称(例如Git config——global core。编辑器sublime_text)

就是这样!

注意: 崇高的文本 3是我在这个例子中使用的编辑器。

我正在使用GitHub for Windows,这是一个很好的可视化选项。但我也更喜欢命令行,所以当我在Git shell中打开一个存储库时,我只需要设置以下内容:

git config --global core.editor vim

这很有效。

这适用于PowerShell和cmd 1.2(当与PowerShell一起使用时)。在EYZ0号文件中:

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

如何使Sublime Text为Git的默认编辑器?< / >

我发现了一个漂亮的简单的解决方案在这里 -虽然可能有一个错误的路径,你必须复制作者给出的“subl”文件。

我运行的是Windows 7 x64,我必须把“subl”文件放在我的/Git/cmd/文件夹中才能使它工作。

不过,它的效果很好。

根据VonC的 建议,这对我来说很管用(快把我逼疯了):

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

省略-wait可能会导致问题,特别是如果您正在使用Gerrit并且更改id必须手动复制到提交消息的底部。

Atom和Windows 10

  1. 我在桌面上右键单击Atom图标,然后单击属性。

  2. copy &;Start in"位置路径

  3. 用Windows资源管理器查看那里,找到了"atom.exe"

  4. 我在Git Bash中输入:

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

注意:我把\改成了/。我在我的主目录中创建了一个.bashrc,并使用/来设置我的主目录,它工作了,所以我假设/将是一种方式。

# eyz0 # eyz1 # eyz2 # eyz3

对于原子,你可以这样做

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

和类似的Visual Studio Code

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

它会打开一个原子Visual Studio代码窗口供你提交,

或者Sublime Text:

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

以下是Cygwin的解决方案:

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

  2. 如果path为空,则传递空路径

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

然后我设置这些变量:

export EDITOR=notepad2.sh
export GIT_EDITOR='dash /usr/local/bin/notepad2.sh'
  1. 编辑器允许脚本与Git一起工作

  2. GIT_EDITOR允许脚本使用Hub命令 .github.com

Source .

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

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

我需要执行下面的这两个命令来让Git在Windows中启动notepad++:

  • 在.gitconfig中添加以下内容:

    editor = 'C:/Program Files/Notepad++/notepad++.exe' -multiInst -notabbar -nosession -noPlugin
    
  • Modify the shortcut to launch the Git Bash shell to run as administrator, and then use that to launch the Git Bash shell. I was guessing that the context menu entry "Git Bash here" was not launching Notepad++ with the required permissions.

After doing both of the above, it worked.

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

我发现最有用的工具是Git编辑器我的通用代码编辑器,在Windows和Linux中都是而且。它工作得很好,但需要一点设置才能让它正确,所以我在这里完整地记录了这一点:

关于我的主编辑器的边注:对于大型项目,我使用Eclipse作为我的主编辑器,Sublime Text 3作为我的git编辑器,当我需要使用它的高级功能时,如多光标模式,垂直/列选择模式等。对于中小型项目,我只使用Sublime Text 3本身。有关Eclipse的设置说明,请参见我的PDF文档

添加sublime git config --global core.editor "'C:\Program Files\Sublime Text 3\sublime_text.exe'"

我用GIT_EDITOR变量和notepad2作为编辑器解决了一个类似的问题。

解决方法一:将环境变量GIT_EDITOR设置为C:/tools/notepad2.exe。这工作得很好,但是如果提交消息有非ascii字符,git会报错。

解决方案2:将GIT_EDITOR设置为C:/tools/notepad2.exe //utf8。注意程序开关前的双斜杠。顺便说一句:-utf8也可以。

假设你想配置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

注意:

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

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

您需要用VsCode的“。exe”路径替换单词code

例如:

[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

注意:

  • 你需要用的单引号 ''包围路径。
  • 路径中的斜杠应该是正斜杠 /

再举一个例子:

[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

更新:

VsCode现在支持“3路合并”! 更新在1.69.01.70.0版本中完成。 现在你可以启用VsCode的“mergetool”;

.使用实例

为此,你需要更新行:

[mergetool "vscode"]
cmd = code -w -n $MERGED

与新行:

[mergetool "vscode"]
cmd = code -w -n --merge $REMOTE $LOCAL $BASE $MERGED