我正在 Windows 上试用 Git。我到了尝试“git commit”的地步,但出现了这个错误:
终端是哑的,但没有定义 VISUAL 或 EDITOR。请使用 -m 或 -F 选项提供消息。
所以我发现我需要一个名为 EDITOR 的环境变量。没问题。我将其设置为指向记事本。这几乎奏效了。默认提交消息在记事本中打开。但记事本不支持裸换行。我出去得到了 Notepad++,但我不知道如何将 Notepad++ 设置为 %EDITOR%
,以便它可以按预期与 Git 一起使用。
我没有嫁给记事本++。在这一点上,我不介意我使用什么编辑器。我只想能够在编辑器中输入提交消息,而不是命令行(使用 -m
)。
那些在 Windows 上使用 Git 的人:你用什么工具来编辑你的提交消息,你必须做什么才能让它工作?
git config core.editor notepad
现在就足够了。请参阅my updated answer below。
2015 年 9 月更新(6 年后)
last release of 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(2018 年第一季度)将显示一条消息,告诉用户它在生成编辑器时正在等待用户完成编辑,以防编辑器打开到隐藏窗口或不明显的地方并且用户迷路了。
请参阅 Lars Schneider (larsxschneider
) 的 commit abfb04d(2017 年 12 月 7 日)和 commit a64f213(2017 年 11 月 29 日)。
帮助:Junio C Hamano (gitster
)。
(由 Junio C Hamano -- gitster
-- 在 {6 中合并},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 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 shell。
(不是使用 core.editor 配置机制,其中包含“start /WAIT...
”的脚本不起作用,但只打开一个新的 DOS 窗口)
Bennett's answer 提到了避免添加脚本的可能性,而是直接引用程序本身在单引号之间。注意斜线的方向!使用 /
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:\prog\git>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 命令将触发 notepad++ 的新实例(因此 {3 }' 选项),并在继续之前等待该实例关闭。
请注意,我只使用'/',而不是 \
'。而我 installed msysgit using option 2.(将 git\bin
目录添加到 PATH
环境变量,但不覆盖某些内置 Windows 工具)
notepad++ 包装器名为 .bat 的事实并不重要。
最好将其命名为“npp.sh”并将其放在 [git]\cmd
目录中(或放在 PATH 环境引用的任何目录中)多变的)。
也可以看看:
如何使用可视 diff 程序查看“git diff”输出?对于一般理论
如何使用 msysgit / gitk 设置 DiffMerge?另一个外部工具示例(DiffMerge 和 WinMerge)
lightfire228 添加 in the comments:
对于任何遇到 N++ 只打开一个空白文件而 git 不接受您的提交消息的问题的人,请参阅“由于空消息而中止提交”:将您的 .bat 或 .sh 文件更改为:
"<path-to-n++" .git/COMMIT_EDITMSG -<arguments>.
这将告诉 notepad++ 打开临时提交文件,而不是一个空白的新文件。
在 Darren's answer 的基础上,要使用 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
。
它对我来说就像一个魅力。
第 How to set Notepad++ as the default Git editor for commits instead of Vim 条解释了命令的参数。
无论如何,我一直在玩这个,发现以下内容对我很有效:
git config --global core.editor "'C:/Program Files/TextPad 5/TextPad.exe' -m"
我认为 CMD 不喜欢单引号,因此您必须使用双引号“指定嵌入空格的字符串参数”。
另一方面,Cygwin(我相信它是 Git 的 Bash 的底层平台)同时喜欢 '
和 "
;您可以使用 /
而不是 \
指定类似 CMD 的路径,只要字符串被引用,即在这种情况下,使用单引号。
-m
覆盖/指示使用多个编辑器,并且不需要在末尾添加 %*
。
git config --global core.editor "'C:\Program Files\Sublime Text 3\sublime_text.exe' -m"
对我来说就像一个魅力。
editor = notepad
编辑:更新到 Vim 7.3 后,我得出的结论是,最干净和最简单的方法是:
将 Vim 的主文件夹添加到您的路径(右键单击我的电脑 → 属性 → 高级 → 环境变量)运行: git config --global core.editor "gvim --nofork '%*'"
如果你这样做,那么我相当肯定它也适用于 Cygwin。
原答案:
即使有几个与 Vim 相关的答案,我也无法在 Windows 下使用 gVim(而不使用批处理文件或 %EDITOR% 或 Cygwin)。
我最终得出的结论是干净整洁,并借鉴了这里的一些解决方案:
git config --global core.editor \
"'C:/Program Files/Vim/vim72/gvim.exe' --nofork '%*'"
我花了一段时间的一个问题是这些不是 Windows 风格的反斜杠。它们是正常的正斜杠。
Program Files(x86)
中,那么您显然需要更改路径。
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,但由于我试图将 Git 介绍给公司,所以我想要我们都拥有的东西,并发现写字板似乎工作正常(即 Git 确实等到你完成编辑并关闭窗户)。
git config core.editor '"C:\Program Files\Windows NT\Accessories\wordpad.exe"'
那是在 msysgit 上使用 Git Bash;我没有尝试过 Windows 命令提示符(如果这有什么不同的话)。
对于 Atom,您可以这样做
git config --global core.editor "atom --wait"
和 Visual Studio Code 类似
git config --global core.editor "code --wait"
这将打开一个 Atom 或 Visual Studio Code 窗口供您提交,
或 Sublime Text:
git config --global core.editor "subl -n -w"
我也在 Windows 上使用 Cygwin,但使用 gVim(与基于终端的 Vim 不同)。
为了完成这项工作,我做了以下工作:
创建了一个包含以下内容的单行批处理文件(名为 git_editor.bat): "C:/Program Files/Vim/vim72/gvim.exe" --nofork "%*" 将 git_editor.bat 放在我的 PATH 中。设置 GIT_EDITOR=git_editor.bat
完成此操作后,git commit
等将正确调用 gVim 可执行文件。
注意 1:gVim 的 --nofork
选项确保它阻塞直到提交消息被写入。
注意 2:如果路径中有空格,则需要在 gVim 路径周围加上引号。
注意 3:如果 Git 传递带有空格的文件路径,则需要在 "%*" 周围加上引号。
感谢 Stack Overflow 社区...和一些研究,我能够让我最喜欢的编辑器 EditPad Pro 作为 Windows 上的 msysgit 1.7.5.GIT 和 TortoiseGit v1.7.3.0 的核心编辑器 XP SP3...
按照上面的建议,我为代码编辑器添加了 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 "$*"
/newinstance
这样的命令行开关只有一个正斜杠。这对于 Windows 应用程序来说是相当正常的。如果您从 UNIX shell 调用 EditPad,那么您将需要使用您的 shell 提供的任何机制来转义正斜杠,以便它不会将开关视为绝对路径并将单个文字正斜杠传递给 EditPad 的命令行。
/wait
开关。您可以使用带有或不带有 /newinstance
的 /wait
来控制是否应打开新的 EditPad 窗口或是否应重用现有窗口。无论窗口是创建还是重用,脚本启动的进程都将等待文件关闭。 EditPad Pro 6 及更早版本不支持 /wait
。
/wait
旗提示先生... :)
[core]
部分以包含行 editor = "'C:/Program Files/Just Great Software/EditPad Lite 7/EditPadLite7.exe' //wait //newinstance"
。
编辑 c:\Users\YourUser 文件夹中的 .gitconfig 文件并添加:
[core]
editor = 'C:\\Program files\\path\\to\\editor.exe'
这是更大问题的一个症状。值得注意的是,您有一些设置 TERM=dumb
。其他不能正常工作的事情是 less
命令,它表示您没有功能齐全的终端。
这似乎最常见的原因是在全局 Windows 环境变量中将 TERM 设置为某个值。对我来说,当我安装 Strawberry Perl 时出现了问题,有关此的一些信息在 msysgit bug for this problem 以及几个解决方案上。
第一个解决方案是在您的 ~/.bashrc 中添加以下内容来修复它:
export TERM=msys
您可以从 Git Bash 提示符执行此操作,如下所示:
echo "export TERM=msys" >> ~/.bashrc
另一个解决方案最终是我所做的,因为我不关心 Strawberry Perl 将 TERM=dumb
添加到我的环境设置的原因,是去删除 TERM=dumb
作为 directed in this comment on the msysgit bug report。
控制面板/系统/高级/环境变量...(或类似,取决于您的 Windows 版本)是在 Windows 上设置粘性环境变量的位置。默认情况下,未设置 TERM。如果在那里设置了 TERM,那么您(或您已安装的程序之一 - 例如 Strawberry Perl)已设置它。删除该设置,你应该没问题。
同样,如果您使用 Strawberry Perl 并关心 CPAN 客户端或类似的东西,您可以不理会 TERM=dumb
并在 ~/.bashrc 文件中使用 unset TERM
,这将具有与设置显式术语类似的效果如上。
当然,所有其他解决方案都是正确的,因为您可以使用 git config --global core.editor $MYFAVORITEEDITOR
确保 Git 在需要为您启动一个编辑器时使用您最喜欢的编辑器。
我需要执行以下两项操作才能让 Git 在 Windows 中启动 Notepad++:
将以下内容添加到 .gitconfig: editor = 'C:/Program Files/Notepad++/notepad++.exe' -multiInst -notabbar -nosession -noPlugin
修改启动 Git Bash shell 的快捷方式以管理员身份运行,然后使用该快捷方式启动 Git Bash shell。我猜测上下文菜单条目“Git Bash here”没有以所需的权限启动 Notepad++。
完成上述两项后,它起作用了。
我的 PortableGit 1.6 工作正常,但升级到 PortableGit 1.7 Windows 版本后,我遇到了问题。一些 Git 命令可以很好地打开 Notepad++.exe,但有些不能,尤其是 Git rebase 的行为不同。
问题是一些命令运行 Windows cmd 进程,而一些使用 Unix cmd 进程。我想给记事本++编辑器提供启动属性,所以我需要一个自定义的脚本。我的解决方案是这样的。
创建一个脚本来运行适当的文本编辑器。该脚本看起来很奇怪,但它同时处理了 Windows 和 Unix 变体。 c:/PortableGit/cmd/git-editor.bat #!/bin/sh # 打开一个新的实例 function doUnix() { "c:\program files\notepad++\notepad++.exe" -multiInst -nosession -notabbar $* exit } doUnix $* :WINCALL "c:\program files\notepad++\notepad++.exe" -multiInst -nosession -notabbar %* 设置全局 core.editor 变量脚本被保存到 git/cmd 文件夹,所以它已经在一个 gitconsole小路。这是强制性的,因为完整路径可能无法正常工作。 git config --global core.editor "git-editor.bat"
现在我可以运行 git commit -a 和 git rebase -i master 命令。如果您在 Git Windows 工具中遇到问题,请尝试一下。
我在多个平台上使用 Git,我喜欢在所有平台上使用相同的 Git 设置。 (事实上,我所有的配置文件都在 Git 的发布控制之下,并在每台机器上放置了一个 Git 存储库克隆。)我想出的解决方案是这样的:
我将编辑器设置为 giteditor
git config --global core.editor giteditor
然后我在我的 PATH 中创建了一个名为 giteditor 的符号链接。 (我有一个个人 bin 目录,但 PATH 中的任何位置都可以。)该链接指向我当前选择的编辑器。在不同的机器和不同的平台上,我使用不同的编辑器,所以这意味着我不必更改我的通用 Git 配置(.gitconfig),只需更改 giteditor 指向的链接。
符号链接由我所知道的每个操作系统处理,尽管它们可能使用不同的命令。对于 Linux,您使用 ln -s。对于 Windows,您使用 cmd 内置的 mklink。它们有不同的语法(你应该查一下),但它们的工作方式都是一样的,真的。
error: cannot spawn giteditor: No such file or directory
基于 VonC's suggestion,这对我有用(让我发疯):
git config --global core.editor "'C:/Program Files (x86)/Sublime Text 3/subl.exe' -wait"
省略 -wait
可能会导致问题,尤其是当您使用 Gerrit 并更改必须手动复制到提交消息底部的 ID 时。
这是我使用 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 中运行。
如果路径中有空格,似乎 Git 找不到编辑器。因此,您必须将 Patrick's answer 中提到的批处理文件放入非空白路径中。
我更喜欢使用 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\runemacs.exe
手动运行该现有进程。
通过使用引号和 /
设置 EDITOR 变量,我设法使环境版本正常工作:
EDITOR="c:/Program Files (x86)/Notepad++/notepad++.exe"
我很难让 Git 与 WordPad、Komodo Edit 以及我给它的几乎所有其他编辑器合作。大多数打开编辑,但 Git 显然不会等待保存/关闭发生。
作为拐杖,我一直在做
git commit -m "Fixed the LoadAll method"
保持事情的进展。它倾向于使我的提交消息比它们应该的要短一些,但显然在 Windows 版本的 Git 上还有一些工作要做。
GitGUI 也没有那么糟糕。它需要一点方向,但在那之后,它工作得相当好。
我刚刚遇到同样的问题并找到了不同的解决方案。我得到
error: There was a problem with the editor 'ec'
我的路径上有 VISUAL=ec
和一个名为 ec.bat
的批处理文件,其中包含一行:
c:\emacs\emacs-23.1\bin\emacsclient.exe %*
这让我可以使用 ec <filename>
从命令行编辑文件,并且设置 VISUAL
意味着大多数 unixy 程序也可以使用它。不过,Git 搜索路径的方式似乎与我的其他命令不同 - 当我查看 Process Monitor 中的 git commit
时,我看到它在路径上的每个文件夹中查找 ec
和 ec.exe
,但不是 {7 }。我添加了另一个环境变量(GIT_EDITOR=ec.bat
),一切都很好。
我正在使用 GitHub for Windows,这是一个不错的视觉选择。但我也更喜欢命令行,所以当我在 Git shell 中打开存储库时,为了让它工作,我只需设置以下内容:
git config --global core.editor vim
效果很好。
这适用于 PowerShell 和 cmder 1.2(与 PowerShell 一起使用时)。在文件 ~/.gitconfig
中:
[core]
editor = 'c:/program files/sublime text 3/subl.exe' -w
How can I make Sublime Text the default editor for Git?
我发现发布了 here 的一个非常简单的解决方案 - 尽管您必须复制作者给出的“subl”文件的路径中可能存在错误。
我正在运行 Windows 7 x64,我必须将“subl”文件放在我的 /Git/cmd/
文件夹中以使其工作。
不过,它就像一个魅力。
Atom 和 Windows 10
我右键单击桌面上的 Atom 图标,然后单击属性。复制“开始”位置路径用Windows资源管理器查看那里并找到“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
%LocalAppData%\\atom\\bin\\atom.cmd --wait
也有错误
添加崇高的git config --global core.editor "'C:\Program Files\Sublime Text 3\sublime_text.exe'"
我使用 GIT_EDITOR
变量和 notepad2
作为编辑器解决了类似的问题。
解决方案 1:将环境变量 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 中配置编辑器的自定义路径:
您需要将单词 code
替换为 VsCode 的“.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
注意:您需要用单引号 '' 将路径括起来。路径中的斜杠应该是正斜杠 /。
或者另一个例子:
[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
不定期副业成功案例分享
git config
设置中引用脚本的原因。dir /X
等效项:“PROGRA~2
”代表“Program Files (x86)
”,这是在 Windows 上使用跨平台兼容工具时养成的好习惯,它允许您压缩空格。