git rev-parse --verify 说 "fatal: Needed a single revision"

git rev-parse --verify says "fatal: Needed a single revision"

考虑这个测试脚本。

#!/bin/sh -x

rm -rf origin clone
git init origin
cd origin
echo foo > file
git add -A
git commit -m "initial commit"
git branch foo

cd ..
git clone origin clone
cd clone
git rev-parse --verify foo

我们创建一个 origin 存储库,创建一个名为 foo 的分支,克隆该存储库,并在克隆中尝试验证名称 foo 是一个有效的对象git rev-parse --verify foo.

但是当我 运行 这个时,它说 "fatal: Needed a single revision" 这对我来说没有任何意义。

我猜它是想告诉我 foo 不是分支名称,只有 origin/foo 存在?但是当我 git checkout foo.

时它显然有效

总的来说,我想做的是提前验证 git checkout foo 是否有效,而不是 运行 宁 git checkout foo。我该怎么做?

你是正确的:克隆中不存在分支 foo

克隆过程通常会复制所有分支——更准确地说,refs/heads/* 形式的引用——到远程跟踪分支,refs/remotes/<remote>/* 形式的引用。 (遥控器的名称是您使用 -o 指定的名称,如果您未指定任何名称,则为 origin。)

克隆完成后,git clone 对您使用 -b 指定的分支执行 git checkout。如果您不指定某些内容,它会使用它可以看到的 HEAD 来决定要 git checkout 的内容;大多数情况下,它只是结束 git checkout master.

最后 git checkout master 步骤实际上创建了本地分支 master,由于 git checkout 文档中的这一点:

If branch is not found but there does exist a tracking branch in exactly one remote (call it remote) with a matching name, treat as equivalent to
$ git checkout -b <em>branch</em> --track <em>remote</em>/<em>branch</em>

所以如果你确定你只是 git cloned 所以只有一个遥控器,并且你知道遥控器的名称是 origin,你可以简单地做一个 git rev-parse --verify origin/foo 以查明该远程跟踪分支是否存在。 (根据需要修改不同名称的遥控器;and/or,使用 git remote 获取所有可能的遥控器列表,然后遍历所有遥控器以查明是否恰好有一个分支名为 foo, 如果需要的话。)

我不确定这个过程是否完全万无一失,如果某些远程具有奇怪的值 fetch = 行,例如,如果远程 origin 提取到名为 [=31= 的远程跟踪分支] 而不是 refs/remotes/origin/master,可能 git checkout 就可以了,但是如果您检查 origin/master,您将找不到它。 (另一方面,奇怪的值 fetch = 行会混淆 git 的其他位,包括我今天早上在 git pull 中查看的一些代码。)