【问题标题】:Git error "fatal: ambiguous argument 'HEAD': unknown revision or path not in the working tree"Git错误“致命:不明确的参数'HEAD':未知的修订或路径不在工作树中”
【发布时间】:2012-08-29 08:59:19
【问题描述】:

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

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版本是什么?它是如何安装的?
  • Git 是通过 apt-get 安装的,版本是 1.7.2.5。
  • 在我看来,你好像在 shell 提示符中使用了一些 git 命令——我认为错误消息来自那里。
  • @ebneter:确实是的,但为什么会出现错误消息?
  • @CharlesB:第一次提交后,不再显示错误。

标签: macos git virtualbox


【解决方案1】:

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

% 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 提示符(ZSH 的 wunjo 提示符主题的大量修改版本)更新 Git 信息的函数中,我有以下方法来解决这个问题:

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 ...
}

【讨论】:

  • 旧版本的 git(至少我知道 1.6.4.4 是这样)不使用 head 作为 HEAD 的同义词。在我的情况下,我被这个旧版本的 git 卡住了,并且能够通过在我的尝试中引用 HEAD 而不是 head 来解决这个问题。
【解决方案2】:

Jacob Helwig 提到in his answer

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

Jeff King (peff) 中的Commit 62f162f 应该会提高 Git 1.9/2.0(2014 年第一季度)中 git rev-parse 的稳健性(除了 commit 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>...]'

【讨论】:

    【解决方案3】:

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

    我需要做的就是对我的主分支进行初始提交,以使这条消息消失。

    【讨论】:

      【解决方案4】:

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

      对于那些仍然面临这个问题的人,我能够解决它如下:

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

      【讨论】:

      • 太好了,这对我也有用!在命令起作用之前,我还需要运行 git config user.name "AnyName"git config user.email "any@email.com"
      • 为什么末尾有.
      • 我的错,. 必须在最后一个引号之前。
      【解决方案5】:

      我遇到了同样的问题,我在安装 CocoaPods 后通过“pod setup”解决了它。

      【讨论】:

        【解决方案6】:

        在我的情况下,它是 克隆深度(我设置为 1 并忘记了它)

        Jenkins 正在运行:

        git rev-parse 2865c1ce8248de835b5a3fbfcce09e7346d5e3ea^{commit}
        

        (该提交是 HEAD 后面的一些提交。)

        使用--depth=1 进行克隆/获取时,我会在运行git rev-parse 时收到此错误。当克隆更大的数字(或没有--depth)时,git rev-parse 工作正常。

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

        【讨论】:

          【解决方案7】:

          此问题的根源在于您要查找的参考文献之一不存在。

          这可能是因为:

          1. 您要查找的提交尚未发生(因此围绕新存储库的各种答案不起作用)
          2. 您通过浅层签出(--depth = 0、bare 或 mirrored)克隆了存储库
          3. 您签出了不包括标签和/或分支的存储库,并且您正在按名称查找该标签/分支

          ...可能还有其他我不知道的原因。就我而言,结帐已满,但已排除标签。运行:

          git fetch --all --tags

          清除它。

          【讨论】:

            【解决方案8】:

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

            【讨论】:

              猜你喜欢
              • 1970-01-01
              • 2021-09-15
              • 1970-01-01
              • 2023-03-25
              • 2016-09-15
              • 2020-07-24
              • 2017-12-19
              • 1970-01-01
              • 1970-01-01
              相关资源
              最近更新 更多