git rev-parse --verify命令显示“fatal: Needed a single revision”。

12

考虑这个测试脚本。

#!/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的分支,克隆该仓库,并在克隆版本中尝试使用 git rev-parse --verify foo 验证名称 foo 是否是有效的对象。
但是当我运行它时,它会显示“fatal: Needed a single revision”,这对我来说毫无意义。
我想它试图告诉我foo不是一个分支名称,只有 origin/foo 存在?但是当我执行 git checkout foo 时,它显然是有效的。
总的来说,我的目标是在实际运行 git checkout foo 之前,先验证它是否有效。 我该怎么做?
1个回答

12

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

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

克隆完成后,git clone会使用-b指定的分支进行git checkout。如果您没有指定任何内容,它将使用HEAD看到的内容来决定要检出什么;最常见的情况是它会执行git checkout master

正是最后的git checkout master步骤实际上创建了本地分支master,因为来自git checkout文档的这一部分:

  

如果未找到branch,但是确实存在一个跟踪分支    恰好在一个远程(称其为remote)中具有匹配的名称,请将    视为等效于
    $ git checkout -b branch --track remote/branch

因此,如果您确定刚刚git clone只有一个远程,且您知道远程的名称为origin,则可以简单地执行git rev-parse --verify origin/foo以查找该远程跟踪分支是否存在。(根据需要修改不同命名的远程;和/或使用git remote获取所有可能的远程列表,然后循环遍历所有远程以了解是否存在名为foo的分支。)

我不确定如果某些远程仓库的fetch行出现奇怪的值是否完全可靠,例如,如果远程仓库origin将内容fetch到名称为refs/remotes/weird/master的远程跟踪分支而非refs/remotes/origin/master,则git checkout可能会正常工作,但是如果你查找origin/master,则无法找到它。(另一方面,奇怪值的fetch行将混淆git的其他部分,包括我今早在git pull中查看的代码。)


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