为什么在我的 commit-msg 挂钩中将 `GIT_EDITOR` 设置为 `:`(冒号)?

Why is `GIT_EDITOR` set to `:` (colon) within my `commit-msg` hook?

我有一个 commit-msg 钩子试图读取 GIT_EDITOR 环境变量。

在我的shell中没有设置$GIT_EDITOR

$ echo $GIT_EDITOR

$ test -z "$GIT_EDITOR" && echo "GIT_EDITOR empty"
GIT_EDITOR empty

但是在 commit-msg 挂钩中它似乎设置为 :。为什么是这样?有办法防止它发生吗?

我已经在多台机器上对此进行了测试,发现到处都是相同的行为。

减少测试用例:

$ mkdir /tmp/git-hook-editor-test && cd /tmp/git-hook-editor-test/
$ git init
$ echo 'echo "GIT_EDITOR =" $GIT_EDITOR && exit 1' > .git/hooks/commit-msg
$ touch foo.txt
$ git add foo.txt
$ git commit -m 'foo' foo.txt
GIT_EDITOR = :

答案在 documentation(靠近 "pre-commit" 描述的底部):

All the git commit hooks are invoked with the environment variable GIT_EDITOR=: if the command will not bring up an editor to modify the commit message.

如果您不使用 -m,您应该会看到它变得更有意义。