2013-12-17 60 views
3

看來,很多人已經去替換git clone與組合git init && git fetch。這看起來很愚蠢,不幸的是Jenkins這樣的工具不會爲你做。那麼爲什麼git clone不會採用refspec,就像git fetch所做的一樣?爲什麼「git clone」不能使用refspec?

具體而言,如果您希望在Jenkins上運行gerrit觸發的構建任務,則需要確保工作區存在,否則jenkins將無法檢出包含gerrit更改的修訂版。這是因爲gerrit使用的是不在git clone獲取的ref路徑。

+0

答案可能取決於人們爲什麼選擇'git clone''git init && git fetch'組合。 –

+0

解釋問題中的用例。 –

回答

3

請指定gerrit使用的refname,克隆後缺少的名稱。而只需git clone --origin <gerrit-suitable-origin-name>解決問題?

現在的長版。你的問題可能是兩個問題的結合。爲什麼git initgit remote addgit fetch這是有利的,爲什麼在最初克隆存儲庫時沒有辦法方便地過濾refspecs?

refspecs - 克隆初始化回購後,該命令的遠程的Refspec行爲是默認的部分添加到概述獲取規格的的.gitconfig:

[remote "origin"] 
url = ssh://host/your.git 
fetch = +refs/heads/*:refs/remotes/origin/* 

這些都是很好的和理智默認值,並且提供的refspecs用於從遠程獲取所有內容。如果您需要更改refspecs,只需編輯文件即可手動完成。例如,

[remote "origin"] 
url = ssh://host/your.git 
fetch = +refs/heads/atari:refs/remotes/origin/atari 
fetch = +refs/heads/vertigo:refs/remotes/origin/vertigo 

編輯後,取將只涉及從原點遠程的atarivertigo分支機構,例如通常存在master,有可能在遙控器上存在被忽略所有其他部門一起。這當然類似於在命令行上提供git fetch的refspecs的選項。

總體而言,它並不是一個簡單的設計,它可以在git clone命令行上支持多個初始參考,僅用於將它們放置在.gitconfig中。通過在.gitconfig文件上運行git clone,然後sed,您甚至可以編寫相同的腳本。當克隆給出許多可能的參考規格時,決定哪個是最初的分支結賬也是有問題的。

初始化過克隆 - 假設我們避免討論更先進的git clone設置,如利用--reference,淺深度--depth,或創建裸回購,區分初始化加取和克隆是您非常輕微日常生活。

普通克隆只是複製一個現有的存儲庫,並將設置「origin」作爲創建源的遠程設備。這帶來一些輕微的煩惱 - 「原點」遠程被強制在你身上,遠程追蹤分支被創建,初始分支被設置,HEAD被檢出。但是,如果你從git init開始,你的控制力就會稍微好一些。您可以開始手動添加遙控器並獲取特定的分支而不檢查任何東西。

請注意,git clone行爲的許多方面可以通過命令行開關控制 - 所以也許開發人員更喜歡git init只是不知道他們?問題中沒有足夠的信息來決定。與其他選項相比,git clone爲您節省了一些打字費用,避免了宇宙的熱量死亡,並設置了合理的上游默認值 - 例如掌握跟蹤分支。我投票贊成克隆。

+0

我想這是一個公平的答案,但與git中的許多事情一樣,它誘使編碼人員犯錯誤。我現在已經看到了幾個使用以下錯誤邏輯的代碼:'如果存在repo,則git fetch else git clone fi'。正確的邏輯需要'如果不回購 - 然後git克隆fi; git fetch'。我認爲git設計會導致這個錯誤。 哦,gerrit使用refs/changes /爲/ /,所以它完全沒有標準,並且打破了jenkins關於克隆的假設,這就是問題的原因。 –

+0

Git爲您提供了一系列可供選擇的選項,並且我認爲這是一個很好且功能強大的選項。所以我不同意這樣一個事實,即任何使用git方式都會誘發開發者犯錯誤。處理變異性和錯誤的一種方法是制定一個讓每個人都遵守的程序,但是不能強制執行這個程序。 – mockinterface

+0

對於gerrit部分,克隆/初始化後,將映射fetch = + refs/changes/for/*:refs/remotes/origin/*(正如我的答案中所述)幫助jenkins?它應該規範名稱。 – mockinterface

3

git clone可以經由通用--configoption採取refspec

設置在新創建的儲存庫中的配置變量;這會在儲存庫初始化之後立即生效,但是在獲取遠程歷史記錄或檢出任何文件之前。 [...]這使得它很安全,例如,向原始遠程添加額外的提取參數。

例子:

git clone -c remote.origin.fetch=+refs/changes/*:refs/remotes/origin/changes/* https://gerrit.googlesource.com/git-repo 

然而,我才意識到如預期的我git version 2.12.2.windows.2changes裁判是不是克隆時候,確實牽強這不起作用。它得到正確添加到.git/config,但我需要通過

cd git-repo 
git fetch 

編輯克隆後手動獲取它:這原來是known bug

相關問題