2014-01-23 254 views
3

我有一堆被刪除的遠程分支,現在我想在本地刪除分支。我已經試過:git fetch prune不工作

git fetch -p

,但它不工作。

如果我做的:

git branch -r

git branch

名單是不一樣的,因爲git branch仍列表中刪除遠程分支,我跑git fetch -p即使經過。我已經將此視爲在這裏的幾個問題上接受的答案,但它不適用於我。

我不確定我是否正確表達了這個問題,所以這裏有另一個解釋。說我有:

GitHub的:(遠程)
        A分支
       科乙
       支路C

本地:
       分公司A ==>(遠程)支路A
       科乙==>(遠程)分公司乙
       支路C ==>(遠程)支路C

現在有人刪除在GitHub上的一個分支,贈送:

GitHub的:(遠程)
        A分支
        C路

我想我的本地回購的樣子是:

地方:
       分公司A ==>(遠程)分支A
       支路C ==>(遠程)C路

+0

您是否從正確的遠程獲取?假設'origin',嘗試'git fetch -p origin'。 – Chris

+0

如果'git branch'(不帶'-r')列出它們,它們不是遠程分支。 – hobbs

回答

10

要擴大hobbs' commentgit fetch -p(或git remote prune或任何類似命令)只會從存儲庫中刪除遠程不再存在的每個「遠程分支」。

如果您製作了本地分支,該標籤不會消失,除非您手動刪除它。

例如,假設在遠程origin,有一個分支命名爲sparkly

$ git fetch 
... 
* [new branch]  sparkly -> origin/sparkly 

你沒有一個分支命名爲sparkly在這一點上,(除非你已經有一個!)你只有origin/sparkly(它住在一個單獨的名稱空間,refs/remotes/而不是refs/heads/)。

如果您之前創建了自己的分支sparkly,它可能不會跟蹤這個新的origin/sparkly。如果您創建自己的分支sparkly現在,但它會跟蹤origin/sparkly

但是在這兩種情況下,沒有東西會自動刪除它。你必須手動完成。

一個原因就是:沒有保證,僅僅因爲origin/sparkly這一走,完成它(「它」是你創建的本地分支,它可能會或可能不會跟蹤遠程分支)。如果git刪除了標籤以及origin/版本,那麼您一直在進行的任何提交都可能變得很難找到。

所以,簡單的答案是:您必須手動執行此操作(或半手動操作,您可以根據需要自動執行此操作)。用途:

git branch -d sparkly 

刪除它只是如果這就是 「安全」(在Git的意見:-)),或:

git branch -D sparkly 

,即使混帳認爲這是 「不安全」 將其刪除。

4

「忘記」 在本地,刪除遠程分支機構,你可以做

git remote prune myRemote 

(編輯考慮到評論)

現在,刪除您當地的分支機構,以及你可以做

remote=origin 

for branch in $(git branch | sed 's/\*//'); do       
    if [ -z "$(git branch --all | grep $remote | grep $branch)" ]; then 
    git branch -D $branch 
    fi                  
done      

如果您打算經常做這樣的操作,你可以在你的PATH把這個腳本,調用它git-delete-local-to-sync,然後,在你的回購,只需要輸入git delete-local-to-sync