Git错误“fatal: ambiguous argument 'HEAD': unknown revision or path not in the working tree” (意思是在Git中遇到了这个错误信息)

112

我正在尝试从Debian(实际上是在Mac OS X上安装和运行的VirtualBox中的虚拟机)初始化一个新的Git存储库:

cd ~
mkdir test
cd test
git init

Initialized empty Git repository in /home/david/test/.git/
fatal: ambiguous argument 'HEAD': unknown revision or path not in the working tree.
Use '--' to separate paths from revisions

[david@server-VM-001:test  (master #) $]

什么问题?


这不应该发生... Git 版本是多少?它是如何安装的? - CharlesB
2
Git是通过apt-get安装的,版本为1.7.2.5。 - David
4
在我的看法中,你在命令提示符中使用了一些 git 命令 - 我认为错误信息就是来自那里。 - ebneter
1
@ebneter:确实是这样,但为什么会出现错误消息呢? - David
4
@CharlesB:第一次提交后,不再显示错误。 - David
显示剩余4条评论
10个回答

61

我通常在Linux机器上使用Git,但在工作中必须使用Windows。在Windows环境下提交第一个提交时遇到了同样的问题。

对于仍然面临此问题的人,我解决方法如下:

git commit --allow-empty -n -m "Initial commit."

太好了,这对我也起作用!在运行该命令之前,我还需要运行 git config user.name "AnyName"git config user.email "any@email.com" - Jeromy Adofo
1
为什么末尾要加一个 . - alper
1
我的错误,点号 . 必须在最后一个引号之前。 - J.Adler
1
你能解释一下是什么导致了这个错误,以及为什么这样做可以解决它吗? - Ooker
1
我不再使用Windows环境,也不知道这个错误现在是否仍然存在。但是在一个新的存储库中,仍然没有对HEAD的引用,正如Jacob Helwing所提到的,命令可能在Windows环境中运行时缺乏足够的错误检查。执行git-commit命令时,我传递了-n --no-verify参数以避免调用pre-commitcommit-msg,这使我们陷入了与此帖子标题相同的错误,并通过使用--allow-empty使我只需解决此问题。 - J.Adler

44

正如其他人指出的那样,此消息来自您的shell提示符。问题在于,在新创建的存储库中,HEAD (.git/HEAD) 指向一个尚不存在的引用。


(译注:代码中的 HEAD 表示 Git 仓库中当前活跃分支的名称。)

% git init test
Initialized empty shared Git repository in /Users/jhelwig/tmp/test/.git/
% cd test
% cat .git/HEAD
ref: refs/heads/master
% ls -l .git/refs/heads
total 0
% git rev-parse HEAD
HEAD
fatal: ambiguous argument 'HEAD': unknown revision or path not in the working tree.
Use '--' to separate paths from revisions

看起来在使用rev-parse之前没有进行足够的错误检查。在第一个提交创建后,.git/refs/heads看起来有点不同,git rev-parse HEAD将不再失败。

% ls -l .git/refs/heads
total 4
-rw------- 1 jhelwig staff 41 Oct 14 16:07 master
% git rev-parse HEAD
af0f70f8962f8b88eef679a1854991cb0f337f89
在更新我的shell提示符的Git信息的函数中(这是wunjo提示主题的大幅修改版本,用于ZSH),我使用以下内容来解决这个问题:
zgit_info_update() {
    zgit_info=()

    local gitdir=$(git rev-parse --git-dir 2>/dev/null)
    if [ $? -ne 0 ] || [ -z "$gitdir" ]; then
        return
    fi

    # More code ...
}

4
较旧版本的Git(至少1.6.4.4版本是这样)不将“head”用作“HEAD”的同义词。在我的情况下,我被困在这个较旧的Git版本中,通过在尝试中使用“HEAD”而不是“head”,我能够避免这个问题。 - Luke Griffiths

8

当我在创建新的Git项目时,在我的终端上设置自定义显示时遇到了这个问题(例如,我的分支显示在路径名之前,例如, <branch>:/current/path)。

我只需要在主分支上进行初始提交即可使该消息消失。


8
在我的情况中,问题出在克隆深度上(我将其设置为1并忘记了它)。 Jenkins正在运行:
git rev-parse 2865c1ce8248de835b5a3fbfcce09e7346d5e3ea^{commit}

(这个提交比 HEAD 落后几个提交。)

当使用 --depth=1 克隆/获取时,运行 git rev-parse 会出现此错误。如果使用更大的数字 (或不带 --depth) 克隆,git rev-parse 就可以正常工作。

这可能与 OP 的命令略有不同,但它可能会对其他人有所帮助。


和我的情况类似,只是我使用的是默认使用--depth=1的Azure Devops Pipelines。我不得不在checkout步骤中设置fetchDepth: 0来获取所有历史提交。 - Trapsilo Bumi

3

方法1: 尽管您看到该消息,您仍然可以暂存任何更改并提交。

git add .
git commit -m "Initial commit"

第一种方式: 在您的第一个提交之后,由于您将默认拥有主分支,因此该消息将消失。

第二种方式: 如J.Adler所说,您可以在不创建分支的情况下开始提交。

 git commit --allow-empty -n -m "Initial commit."

所以这条消息已经消失。 之后你可以创建你自己的分支。


2

Jacob Helwig在他的回答中提到

看起来在使用rev-parse之前没有进行足够的错误检查

Jeff King (peff)提交 62f162f应该会在Git 1.9/2.0(2014年第一季度)中提高git rev-parse的鲁棒性(除了提交1418567之外):

在无法匹配的情况下(例如,“doesnotexist..HEAD”),我们希望尝试将参数视为文件名。
try_difference() 能够正确处理这种情况并且总是取消编码。然而,try_parent_shorthand() 从不取消编码,导致错误的错误消息或甚至是错误的结果。
$ git rev-parse foobar^@
foobar
fatal: ambiguous argument 'foobar': unknown revision or path not in the working tree.
Use '--' to separate paths from revisions, like this:
'git <command> [<revision>...] -- [<file>...]'

2

我遇到了一个问题,这里的任何答案都没有帮助到我。问题最终是在一个预提交检查中出现了,该检查使用了 git rev-parse。脚本正在检查当前分支是否为 master。我将其改为在脚本中使用 git branch --show-current,问题就消失了。如果错误消息告诉你哪个函数遇到了问题,那将会很有帮助。


1
这个问题的根源是你正在查找的引用之一不存在。
可能的原因包括:
1. 你要查找的提交尚未发生(因此关于新存储库无法工作的各种答案)。 2. 你使用了浅层检出 (--depth = 0,裸露或镜像) 克隆了存储库。 3. 你检出了一个排除标签和/或分支的存储库,并且你正在按名称查找该标签/分支。
... 还有其他我不知道的原因。在我的情况下,检出是完整的,但排除了标签。运行:
git fetch --all --tags
解决了这个问题。

0
这可能是因为一个简单的错误导致的,你可能正在另一个 Git 目录中工作。 也就是说,你必须在克隆目录中执行 Git 命令。

-8

我也遇到过同样的问题,但在安装CocoaPods后通过运行"pod setup"解决了它。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接