git rev-parse --verify说"致命:需要单一修订"

Dan*_*ich 7 git

考虑这个测试脚本.

#!/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
Run Code Online (Sandbox Code Playgroud)

我们创建一个originrepo,创建一个名为fooclone的克隆,克隆repo,然后在克隆中,我们尝试验证该名称foo是否为有效对象git rev-parse --verify foo.

但是,当我运行它时,它说,"致命:需要一次修订",这对我没有任何意义.

我想它试图告诉我这foo不是一个分支名称,只origin/foo存在?但它显然适用于我git checkout foo.

总的来说,我要做的是事先验证它git checkout foo是否有效,而不是实际运行git checkout foo.我该怎么办?

tor*_*rek 8

你是对的:foo克隆中不存在分支.

克隆过程通常会复制所有分支 - 更准确地说,是表单的引用refs/heads/*- 远程跟踪分支,表单的引用refs/remotes/<remote>/*.(遥控器的名称是您指定的任何名称-o,或者origin如果您未指定任何内容.)

克隆完成后,git clone执行git checkout您指定的分支-b.如果您没有指定某些内容,它会使用它可以看到的内容HEAD来决定要做什么git checkout; 最常见的是,它只是结束了git checkout master.

git checkout master是实际创建本地分支的最后一步master,因为git checkout文档中的这一点:

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

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

我不确定这个过程是否完全是万无一失的,如果某个遥控器有奇怪的fetch =线条,例如,如果遥控器origin进入远程跟踪分支refs/remotes/weird/master而不是命名refs/remotes/origin/master,那么这可能git checkout是好的,但如果你检查origin/master你赢了找不到它.(另一方面,奇怪的fetch =线条会混淆其他的git,包括我git pull今天早上看到的一些代码.)