考虑这个测试脚本。
#!/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
。我该怎么做?
答案 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
中看到的一些代码。)