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 clone
d 所以只有一个遥控器,并且你知道遥控器的名称是 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
中查看的一些代码。)
考虑这个测试脚本。
#!/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 clone
d 所以只有一个遥控器,并且你知道遥控器的名称是 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
中查看的一些代码。)