TL;DR
考虑使用:
git push origin FETCH_HEAD:refs/heads/8.9.170
查看详细答案,了解原因。
长(ish)
你的.git/config 的这部分看起来有点奇怪,但不是不可能的奇怪:
[remote "origin"]
url = https://chromium.googlesource.com/v8/v8.git
fetch = +refs/heads/*:refs/remotes/origin/*
fetch = +refs/branch-heads/*:refs/branch-heads/*
第二行 fetch = 乍一看似乎不太可能匹配任何东西:Git 本身不使用命名空间 refs/branch-heads/ 做任何事情。如果它根本不匹配,那很好;它是无害的。如果它确实匹配某些内容,它将强制更新您获取的任何 refs/branch-heads/ 名称。您明确没有获取任何内容,但起初,这似乎是一件奇怪的事情。
但事实证明https://chromium.googlesource.com/v8/v8.git 确实 里面有一大堆refs/branch-heads/ 的名字(我检查了git ls-remote 并看到了它们)。它们是干什么用的,我不知道。它们也有标准的refs/heads/ 分支名称。因为他们确实有这些 refs/branch-heads/ 名称,所以您应该格外小心,我注意到您可以在下面填写完整的 fetch。
同时,this 在这里输出:
$ HOME=/dev/null git fetch origin refs/heads/8.9.170
* branch 8.9.170 -> FETCH_HEAD
表明你有一个真正古老的 Git 二进制文件。这加上其他一些项目可能是您后续所有麻烦的根源。自 1.8.4 以来的 Git 版本将打印:
$ HOME=/dev/null git fetch origin refs/heads/8.9.170
* branch 8.9.170 -> FETCH_HEAD
<hash>..<hash> 8.9.170 -> origin/8.9.170
因为现代 Git 将根据 fetch = 设置“机会性地更新”任何获取的分支,并且虽然您有一个非标准设置,但它之前是标准设置。所以你必须有一个严重过时的 Git。你可以仍然用它完成你的工作;你只需要更明确,通过运行:
HOME=/dev/null git fetch origin +refs/heads/8.9.170:refs/remotes/origin/8.9.170
这一次将更新refs/remotes/origin/8.9.170(强制,因为加号),或者更简单:
HOME=/dev/null git fetch origin
获取所有内容并根据fetch = 行更新所有名称。请注意,这将遵守您对 refs/branch-heads/ 实体的额外规则,更新所有远程跟踪名称 (refs/remotes/origin/*) 和这些奇怪的名称(无论它们是什么)。
尽管如此,您只是将新的提交哈希 ID 放入特殊的 .git/FETCH_HEAD 文件中,git fetch 将其写入其中,以便 git pull 可以找出刚刚获取的内容。由于您没有运行 git pull,这对您没有多大用处。但这就是为什么我们看到提到 FETCH_HEAD 的输出。
现在,我们可以继续使用 git push,您需要对其进行更改。您正在使用(并获得):
$ git push origin refs/heads/8.9.170
error: src refspec refs/heads/8.9.170 does not match any
您没有名为 8.9.170 的分支。即使你有一个现代 Git(而不是 1.8.4 之前的 Git),你仍然没有一个名为 8.9.170 的 分支。相反,您将拥有一个名为8.9.170 的远程跟踪名称。因此,此时您有两个选择:
-
创建一个名为 8.9.170 的 分支。然后,您的命令将按原样运行。
-
从您拥有的名称或哈希 ID 推送。
对于选项 1,如果您有一个创建了远程跟踪名称的现代 Git,这会更好。您可以简单地运行git switch 8.9.170 或git checkout 8.9.170,这将创建该分支然后检查它。或者,为了避免检查它(这需要一点时间:铬源很大),你可以运行git branch 8.9.170 origin/8.9.170,它从origin/8.9.170 创建8.9.170。如果缺少其中任何一个,您可以从 .git/FETCH_HEAD 中提取提交哈希 ID,或使用名称 FETCH_HEAD 创建该分支。
对于更简单的选项 2,您只需运行以下命令:
git push origin FETCH_HEAD:refs/heads/8.9.170
这是 TL;DR 在前面。名称FETCH_HEAD 指(暂时!)由git fetch 获得的哈希ID,因为您的Git 很古老,无法创建远程跟踪名称。这个临时的FETCH_HEAD 存储一直持续到下一个 git fetch,它会覆盖它,所以这必须很快完成。 (这就是为什么这对 git pull 很好,它只运行 git fetch,然后 立即 运行第二个 Git 命令来使用来自 .git/FETCH_HEAD 的值 之前被替换。)