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

时间:2015-02-05 23:01:38

标签: 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

我们创建一个origin repo,创建一个名为foo的分支,克隆repo,在克隆中,我们尝试验证名称foo是否为git rev-parse --verify foo的有效对象{1}}。

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

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

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

1 个答案:

答案 0 :(得分: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 d只有一个遥控器,并且您知道遥控器的名称为origin,那么您只需执行{{1}找出该远程跟踪分支是否存在。 (根据需要修改名称不同的遥控器;和/或使用git rev-parse --verify origin/foo获取所有可能遥控器的列表,然后遍历所有遥控器以查明是否只有一个名为git remote的分支,如果需要的话。)

如果某个遥控器具有奇怪的foo行,例如,如果远程fetch =取代名为origin的远程跟踪分支,我不确定此过程是否完全万无一失refs/remotes/weird/master的{​​{1}}可能会对此有所帮助,但如果您检查refs/remotes/origin/master,则无法找到它。 (另一方面,奇怪的git checkout行会混淆git的其他部分,包括我今天早上在origin/master中看到的一些代码。)