2013-05-16 76 views
15
==> git branch -a 
* master 
    test 
    remotes/origin/master 
    remotes/origin/test 

當有人刪除remotes/origin/test,我仍然可以在我的電腦上看到它。刪除分支不在遠程

我知道我能做到這一點,刪除test

==> git remote prune 
==> git branch -d test 
==> git branch -a 
* master 
    remotes/origin/master 

但是,如果我有更多的本地分支,他們不是在遠程的,所以我怎麼能快速去除呢?

回答

1

你可以通過迭代遍歷refs,我使用下面的命令來刪除所有沒有遠程分支和它工作的本地分支。 警告:此操作強制刪除未完全合併的分支,請謹慎使用。

git branch -D `git for-each-ref --format="%(fieldName)" refs/heads/<branch-name-pattern>` 

%(fieldName) = refname:short)

refs/heads/ =如果你有一個共同的前綴/後綴的分支名稱 前可加後綴:refs/heads/*abc*

請參閱本作的更多信息git-for-each-ref(1) Manual Page

+0

隨着你的解決方案,你會強行刪除沒有完全合併的分支,非常危險! – Matteo

18

按照git-fetch手冊頁,git fetch -p將「提取後,刪除任何遠程跟蹤分支不再存在remote.`如果您有本地分支機構跟蹤這些遠程分支機構,則可能需要手動修剪這些分支機構。

+4

但如何刪除本地分支不在遠程? '-p'只能刪除遠程跟蹤 – Dozer

+5

您能否可靠地區分設置爲跟蹤遠程分支的本地分支和用於本地開發的本地分支?如果我的本地分支被命名爲'foo',它最初是爲跟蹤'remotes/origin/foo'創建的,還是我創建的用於測試一些新想法的本地分支?如果你可以爲每個本地分公司可靠地回答這個問題,你可以把你不想要的那個分支給你。如果你不能,試圖「自動」這將是破壞性的。 – twalberg

26

這是我如何刪除本地分行是不再相關:

git branch --merged origin/master | xargs git branch -d 

您可能需要根據您的具體配置,但第一個命令在此之前的管道應該給你所有的列表來調整它您的本地分行已合併到您的主分行。

+14

由於擔心刪除本地主,我將其修改爲: 'git branch --merged origin/master | grep -v master | xargs git branch -d – thexfactor

+3

Nitpicky更改爲上面的註釋,但爲了避免除了「master」之外的其他分支(即Gitflow中的「develop」),最好不要反轉grep命令,而應該像:'git branch - merged origin/develop | grep「^ \ s * feature /」| xargs git branch -d' –

3

我爲此寫了一個簡單的shell腳本git-dangling-branches。如果指定-D選項,它將刪除所有沒有refs/remotes/origin/<branch_name>的本地分支。當然,當你這樣做時你應該小心。

#!/bin/bash -e 
if [[ "$1" == '-D' ]]; then 
    DELETE=1 
else 
    DELETE=0 
fi 

REMOTE_BRANCHES="`mktemp`" 
LOCAL_BRANCHES="`mktemp`" 
DANGLING_BRANCHES="`mktemp`" 
git for-each-ref --format="%(refname)" refs/remotes/origin/ | \ 
    sed 's#^refs/remotes/origin/##' > "$REMOTE_BRANCHES" 
git for-each-ref --format="%(refname)" refs/heads/ | \ 
    sed 's#^refs/heads/##' > "$LOCAL_BRANCHES" 
grep -vxF -f "$REMOTE_BRANCHES" "$LOCAL_BRANCHES" | \ 
    sort -V > "$DANGLING_BRANCHES" 
rm -f "$REMOTE_BRANCHES" "$LOCAL_BRANCHES" 

if [[ $DELETE -ne 0 ]]; then 
    cat "$DANGLING_BRANCHES" | while read -r B; do 
    git branch -D "$B" 
    done 
else 
    cat "$DANGLING_BRANCHES" 
fi 
rm -f "$DANGLING_BRANCHES" 
+0

這是我想要的答案。我有興趣清除那些在github中不存在同名的本地分支。其他答案刪除遠程跟蹤分支,並刪除所有合併分支,但這不是我想要的。所以謝謝你。爲了以防萬一,我在運行之前將-D更改爲-d。 –

+0

這太棒了。我不得不改變'mktemp'來接觸真實的文件名,因爲我的操作系統中不支持'mktemp',但這絕對是美妙的。 – earl3s

+0

我還添加了這個:'git remote prune origin $ DRY_RUN' at the top where'$ DRY_RUN' is set to'--dry-run' if'-D' does not passed。很好地清理我的系統。 – earl3s

3

簡單的修剪不會刪除本地分支。

這是另一種實現真正刪除的方法。請務必首先執行「git fetch -p」以獲取遠程存儲庫的最新狀態。

git branch -vv | grep ' gone]' | awk '{print $1}' | xargs git branch -d 

這將檢查所有地方分公司及其來源,並會刪除所有地方分公司,其起源已被刪除。

詳細:

git branch -vv 

會列出你的地方分支機構,並顯示有關遠程分支信息,說:「走了」,如果它不存在了。

grep ' gone]' 

將獲取匹配「不見」短語的分支。

awk '{print $1}' 

將獲取輸出,直到第一個空格,這將導致本地分支名稱。

xargs git branch -d 

將使用輸出(分支名稱)並將其附加到「git branch -d」命令以最終刪除該分支。如果您還想刪除未完全合併的分支,則可以使用大寫「D」而不是「d」來強制刪除。

1

我結束了一些非常類似於kcm的方法。我想要一些可以清除所有正在跟蹤遠程分支的本地分支的東西,origin,遠程分支已被刪除(gone)。我不想刪除從未設置爲跟蹤遠程分支的本地分支(即:我的本地開發分支)。此外,我想要一個簡單的單線程,只使用git或其他簡單的CLI工具,而不是編寫自定義腳本。我結束了使用grepawk的一點來使這個簡單的命令,然後將其添加爲我的~/.gitconfig中的別名。

[alias] 
    prune-branches = !git remote prune origin && git branch -vv | grep ': gone]' | awk '{print $1}' | xargs -r git branch -D 

這裏是一個git config --global ...命令輕鬆地添加這是git prune-branches

git config --global alias.prune-branches '!git remote prune origin && git branch -vv | grep '"'"': gone]'"'"' | awk '"'"'{print $1}'"'"' | xargs -r git branch -d' 

注:由於Matteo在他前面的另一個答案評論指出,使用-D標誌來git branch可以很危險的。所以,在配置命令我使用-d選項git branch而不是-D;我在我的實際配置中使用了-D。我使用-D,因爲我不想聽到Git抱怨未裝完的分支,我只是希望它們離開。您也可能需要此功能。如果是這樣,只需在該配置命令的末尾使用-D而不是-d即可。