2013-04-03 28 views

回答

30

這裏假設你的「上游」遠程被命名爲「原點」,並輸入您的用戶名(即「maxandersen」)

當你有你的克隆運行以下單下有你自定義的叉子襯墊(的Track all remote git branches as local branches刷新:

remote=origin ; for brname in `git branch -r | grep origin | grep -v master | grep -v HEAD | sed -e 's/.*\///g'`; do git branch --track $brname $remote/$brname ; done 

這將建立跟蹤分公司在遠程命名爲「原點」 找到的所有分支如果你已經有這個BRANCHNAME結賬也不會除了確保跟蹤到位之外,更改任何內容。

(可選)現在確保您的所有分支都UPTODATE(有用的,如果你已經分公司簽出):

git pull --rebase --all 

現在,隨着各分支機構設置用於跟蹤和UPTODATE推分支標籤遠程(用您的遠程名稱替換'maxandersen'):

git push --all maxandersen 
git push --tags maxandersen 

之後,您的分叉同步。

以下腳本做這一切,包括要求確認:

## Checkout all branches from remote as tracking branches. Based on https://stackoverflow.com/questions/379081/track-all-remote-git-branches-as-local-branches/6300386#6300386 

UPSTREAM=$1 
MYREPO=$2 

usage() { 
    echo "Usage:" 
    echo "$0 <upstream-remote> <target-remote>" 
    echo "" 
    echo "Example which ensures remote named 'maxandersen' have all the same branches and tags as 'origin'" 
    echo "$0 origin maxandersen" 
    exit 1 
} 

if [ -z "$UPSTREAM" ] 
then 
echo Missing upstream remote name. 
usage 
fi 

if [ -z "$MYREPO" ] 
then 
echo Missing target remote name. 
usage 
fi 

read -p "1. This will setup '$MYREPO' to track all branches in '$UPSTREAM' - Are you sure ?" -n 1 -r 

if [[ $REPLY =~ ^[Yy]$ ]] 
then 
for brname in `git branch -r | grep "$UPSTREAM" | grep -v master | grep -v HEAD | sed -e 's/.*\///g'`; do git branch --track $brname $UPSTREAM/$brname ; done 
fi 

read -p "2. This will push all local branches and tags into '$MYREPO' - Are you sure ?" -n 1 -r 

if [[ $REPLY =~ ^[Yy]$ ]] 
then 
git push --all $MYREPO 
git push --tags $MYREPO 
fi 

另存爲「updateallbranchestags.sh」,並執行它:

sh updateallbranches.sh origin maxandersen 

與各分公司從「產地/標籤'將在遠程名爲'maxandersen'

+0

聽起來我的答案的具體實現。 +1 – VonC

+1

是的,請注意,我也移動使用--track而不是--set-upstream來擺脫惱人的棄用警告+我用sed而不是awk使得oneliner更短:)因此,感謝您的提示! –

+0

我不會推薦 - 原因在我的單行答案中解釋http://stackoverflow.com/a/6300386/6309(更新):你應該使用'--set-upstream-to'(或' - - u'),在http://stackoverflow.com/a/10002469/6309 – VonC

15

您仍然需要一個本地克隆,這將:

upstream and fork

  • git push --all origin(原產地是你的叉子):該假設認爲:
    • 你把所有的地方分支機構跟蹤所有上游分支(見前一步)。
      否則,默認情況下您只推送一個本地分支,因爲克隆只會創建一個本地分支(默認分支)
    • 您尚未在自己的分支上推送提交。
+0

upvote發送我在正確的方向:) –

0

您可以直接推動遠程參考。 顯然這並沒有考慮到fork的變化,但它仍然回答了這個問題。如果更改有限,則可以使用當地分支輕鬆合併/重新整理它們。

git push -f origin refs/remotes/upstream/*:refs/heads/* 
相關問題