2016-07-02 67 views
1

這些分支存在西梅原產地分行都在上游沒有上游再

* master 
    remotes/origin/HEAD -> origin/master 
    remotes/origin/gh-pages 
    remotes/origin/master 
    remotes/origin/next 
    remotes/origin/translation 
    remotes/origin/v1.0.1 
    remotes/origin/videoConverter 

,這些都是對分支我的叉子

* master 
    remotes/origin/HEAD -> origin/master 
    remotes/origin/beta 
    remotes/origin/dashboardNewContent 
    remotes/origin/externalUrl 
    remotes/origin/gh-pages 
    remotes/origin/master 
    remotes/origin/next 
    remotes/origin/rc 
    remotes/origin/rc-0.3.0 
    remotes/origin/release-candidate 
    remotes/origin/streama-node 
    remotes/origin/translation 
    remotes/origin/v1.0.0 
    remotes/origin/videoConverter 
    remotes/upstream/gh-pages 
    remotes/upstream/master 
    remotes/upstream/next 
    remotes/upstream/translation 
    remotes/upstream/v1.0.1 
    remotes/upstream/videoConverter 

上游回購以來一直更新我分叉它。我無法找到一種方法從我的叉上刪除上游不再存在的分支。 This GitHub tutorial顯示如何同步提交歷史記錄。

這個問題有直接的解決方案嗎?

回答

4

一招是與upstream網址替換掉origin你的本地倉庫內(引用你的叉子):

git remote rename origin ori 
git remote add origin $(git remote get-url upstream) 

然後一個命令git fetch --prune將在本地刪除所有過時遠程跟蹤分支(在remotes/origin/xxx這是不是在upstream,通過「origin」)

暫時引用的最後,你可以爲每個remotes/ori/xxx分支機構,檢查是否存在remotes/origin/xxx。如果不是:git push --delete ori xxx

是這樣的:(在bash)

for f in $(git for-each-ref refs/remotes/ori --format '%(refname:short)' | 
     sed 's,ori/,,') do; 
    git rev-parse -q --verify refs/remotes/origin/$f >/dev/null || 
     git push --delete ori ${f} 
done 

該腳本可以放在一個git-cleanup(或任何git-xxx名),並調用git cleanup(或git xxx)。這樣,即使在Windows上,它也可以在自己的bash中運行。

要完成:

git remote remove origin 
git remote rename ori origin 
+0

不錯,但使腳本在未來的變化(Git的裁判名字代碼已被轉換爲可插拔後端)的情況下可靠,更換'找到.git'用' git for-each-ref',不幸的是需要使用'sed'或者其他的來編輯遠程的名字。 – torek

+0

我同意。你可以編輯答案嗎? – VonC

+0

完成,但我沒有合適的測試回放,因此我單獨測試了各個部件。另外我不使用Wndows,'/ dev/null'在那裏工作嗎? (人們會希望WIndows bash模擬/ dev/null ... :-)) – torek