2015-02-05 71 views
4

考虑这个测试脚本。git rev-parse --verify说“致命的:需要一个修订”

#!/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分支,克隆回购,并在克隆,我们试图验证名称foogit rev-parse --verify foo有效的对象。

但是,当我运行这个,它说,“致命的:需要一个修订”,这对我没有任何意义。

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

总的来说,我想要做的是事先验证git checkout foo将工作,而不实际运行git checkout foo。我会怎么做?

回答

7

你是对的:分支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文档此位:

如果分支没有找到,但这里的确在 只有一个存在的跟踪分支远程具有匹配名称(称之为远程),治疗 为等同
$ git checkout -b branch --track remote/branch

因此,如果您确定只有git clone d以便只有一个远程设备,并且您知道远程设备的名称是origin,则只需执行git rev-parse --verify origin/foo以查明该远程跟踪分支是否存在。 (根据需要,修改为远程不同名称;和/或使用git remote得到所有可能的遥控器的列表,然后遍历所有的遥控器,以找出是否有完全一个名为foo,如果需要的话分支)。

我不知道如果这个过程是完全万无一失的,如果一些遥控器有奇怪的价值fetch =线,例如,如果远程origin获取到名为refs/remotes/weird/master而不是refs/remotes/origin/master的远程跟踪分支,可能git checkout将是OK,但如果你检查origin/master你不会找到它。 (另一方面,奇怪的fetch =行会混淆其他位的git,包括我在今天早上看到的git pull的一些代码。)