2013-11-04 117 views
3

如何將本地git倉庫中的所有遠程分支轉換爲本地跟蹤分支,而無需逐一檢查每個分支。如何將本地git倉庫中的所有遠程分支轉換爲本地跟蹤分支

爲什麼你可能想要這樣做(我想這樣做的原因)的一個原因是,你可以採取本地回購的克隆,並在新的克隆從原始的遠程起源的所有分支。

因爲「克隆」只克隆本地分支。

編輯:已經提供了一些腳本答案(爲此 - 謝謝!)...我真的希望採用一種乾淨的方式,因此它是完全可移植的(我的用戶是「僅限Windows 「,並且迄今已經存活而不必使用bash(git-bash或其他))。

+0

您可能要成立「第一」克隆(從中計劃重新克隆)作爲一面鏡子,而不是一個正常的工作庫。鏡像就像光禿禿的克隆,只是它直接複製了來自遠程的所有參考。 (更確切地說,它將'fetch' refspec設置爲'+ refs/*:refs/*',而不是,例如'+ refs/heads/*:refs/remotes/origin/*'。) – torek

+0

嗯 - 是嗎? 「正確的」,本地開發者(在這種情況下是從鏡子中克隆的)將會推回到這個鏡像中去? (我對「鏡子」是什麼沒有太多的瞭解,但我有一些模糊的想法,即它是隻讀的) – GreenAsJade

+0

這是一個你想如何工作的問題,但請注意,你不需要必須推送到您從相同的URL。例如,每個回購的'remote.origin.url'都有一個對應的'remote.origin.pushurl'。如果你想要鏡子,我們稱之爲「M」(鏡像),「主要」回購「P」,開發人員克隆「D」 - 成爲「純鏡像」,那麼是的,你不會想要從'D'推到'M',因爲當'M'從'P'提取時它們會丟失;所以'D'應該推到'P'。你可以通過一個預先接收的鉤子來設置'M',這個鉤子表示「拒絕,而是推到'P'」。 – torek

回答

3

到可能做到這一點,最好的辦法是用一個腳本:

#!/bin/bash 
IFS=$'\n' 
for branch in `git branch -r`; do 
    if [[ ${branch} =~ ^\ *(.+)/(.+)$ ]]; then 
     git show-branch "${BASH_REMATCH[2]}" > /dev/null 2>&1 
     if [ $? -ne 0 ]; then 
      git branch ${BASH_REMATCH[2]} ${BASH_REMATCH[1]}/${BASH_REMATCH[2]} 
     fi 
    fi 
done 
+0

這不是所有人都必須問這裏怎麼做,但這個代碼假設多部分分支名稱是遙控器,這不一定是真實的。 – jthill

3

此答案由JAST在freenode的上#git提供給我:

git push . refs/remotes/origin/*:refs/heads/* 

注:如在下面的評論中提到,這不會產生跟蹤分支,儘管它至少可以在支數當地回購是「本地」,並注意「遙遠」。

+1

我希望這可以工作,但我發現最終的分支沒有跟蹤分支。 – cforbish

+0

這是一個愚蠢的問題:你怎麼知道他們沒有跟蹤分支?在我完成上述命令之後,分支機構按照我想要的方式工作...... – GreenAsJade

+0

它們不跟蹤,因爲'git pull'不會自動將本地分支指向新的遠程分支位置後綴。而且'git push'本身並不知道要推送到哪個遠程分支。 – cforbish

1

我喜歡殼命令建設者像這樣的東西。這比早期版本更醜陋,但它也可以在裸機上運行,​​並且具有額外的優勢,即獲取它按照正確順序構建的分支命令上的參數,以便實際工作。

一兩件事 - scriplets這樣 「在-git的解決方案。」

git-track-all-remote-branches() 
{ 
    awk ' 
    $0=="////"{doneloading=1;next} 
    !doneloading {drop[$0]=1;next} 
    !drop[$0] { 
      print "b='\''"$0"'\''; git branch -t ${b##*/} $b" 
    }' <<///EOD/// 
$(git for-each-ref --format="%(upstream:short)" refs/heads) 
//// 
$(git for-each-ref --format="%(refname:short)" refs/remotes) 
///EOD/// 

} 

一個相當新的checkout的特點是,如果你籤裸名稱不是當前的一個分支,但只有一個遠程分支相匹配,它會自動建立一個跟蹤分支吧:

$ git branch 
    master 
$ git branch -r 
    origin/notyet 
    origin/master 
$ git checkout notyet 
Checking out files: 100% (2/2), done. 
Branch notyet set up to track remote branch notyet from origin. 
Switched to a new branch 'notyet' 
+0

尋找git解決方案的一個原因是它更便於攜帶 - 我知道大部分時間git用戶都有可用的bash shell,但我正在與一個團隊合作,這是一個遠投。出於同樣的原因,我試圖避免可怕的腳本:) git在結帳時設置跟蹤分支是很好的...我希望不必檢查每個分支,只是爲了讓它成爲本地和跟蹤,雖然! – GreenAsJade

+0

那些簡單的有時候有用的五行的數量......我無法開始計數。 git的開發者們正在爲這種降低功能做出貢獻,其中爆炸可以是任何事情,但是一個評級是「廣泛使用的*節省時間」。這個很容易實現,而且沒有廣泛的用處。上面的這些花了我十分鐘的時間來實現,如果你在一天中沒有熟練地使用awk,你就可以達到勝任的能力,並且你可以在更短的時間內滿足你的下一個需求,獨自得到它。我會做得更漂亮。 – jthill

2

我認爲@cforbish的回答只能說,隨着該腳本,你應該產生這樣的指令加以改善:

# git branch <local-branch-name> <remote-name>/<remote-branch-name> 

例如,如果您有以下的遠程分支:

# git remote -v 
    remote-repo <repo-directory> (fetch) 
    remote-repo <repo-directory> (push) 
# git branch -r 
    remote-repo/branch1 
    remote-repo/branch2 
    remote-repo/branch3 

你可以通過運行具有本地跟蹤分行:

# git branch branch1 remote-repo/branch1 
# git branch branch2 remote-repo/branch2 
# git branch branch3 remote-repo/branch3 
# git branch 
    branch1 
    branch2 
    branch3 
相關問題