2015-02-05 62 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的一些代碼。)