2012-04-26 15 views
12

以下のスクリプトは、日付順にブランチを一覧表示しています。新しいブランチを除外し、その結果をGit deleteコマンドに入力するにはどうすればよいですか? --since--beforeの使用に関するX日以上経過しているすべてのブランチを削除してください

for k in $(git branch | sed /\*/d); do 
    echo "$(git log -1 --pretty=format:"%ct" $k) $k" 
done | sort -r | awk '{print $2}' 
+0

これは、バージョン管理システムの目的を少し破たんしていませんか? – haziz

+1

@haziz:ブランチを削除しても、履歴の削除は意味しません。ブランチは単にコミット時のポインタと呼ばれます。 – CharlesB

+0

Werはローカルでgitを実行し、svnはリモートから実行するので、gitはローカル作業用です。 – Kenoyer130

答えて

23

どのように?古い週間以上あるすべてのブランチを削除したい場合は

for k in $(git branch | sed /\*/d); do 
    if [ -n "$(git log -1 --since='1 week ago' -s $k)" ]; then 
    git branch -D $k 
    fi 
done 

--before使用:

例えば、これは、週のコミットを受け取っていないすべてのブランチを削除します

for k in $(git branch | sed /\*/d); do 
    if [ -n "$(git log -1 --before='1 week ago' -s $k)" ]; then 
    git branch -D $k 
    fi 
done 

これは、マスターにマージされなかったブランチまたはチェックアウトされたブランチが削除されたブランチも削除することに注意してください。

+0

このソリューションは、私のものよりもエレガントです。 – Julian

+12

上記のコードは素晴らしいですが、私のテストでは、先週コミットを受けたブランチだけが削除されています。私は-nを-zに変更して動作させる必要がありました。 また、より安全にしたい場合は、-Dを-dに変更して、マージされたブランチだけを削除します。 – ben

+0

3行目の '$ k)' 'と'] 'の間のスペースを削除するまで、これはうまくいきませんでした。(OSX固有のものでしょうか?私はわかりません) –

1

ブランチ内のコミットではなく、参照のみを削除するとします。最新の__X__以外のすべての合併の枝を削除するには:

git branch -d `for k in $(git branch | sed /\*/d); do 
    echo "$(git log -1 --pretty=format:"%ct" $k) $k" 
done | sort -r | awk 'BEGIN{ORS=" "}; {if(NR>__X__) print $2}'` 

タイムスタンプ__Y__前に、すべての分岐を削除するには:あなたがされていない枝を削除したい場合は

git branch -d `for k in $(git branch | sed /\*/d); do 
    echo "$(git log -1 --pretty=format:"%ct" $k) $k" 
done | sort -r | awk 'BEGIN{ORS=" "}; {if($1<__Y__) print $2}'` 

-D-dオプションを交換しますまたマージされました...しかし、それは、ダングリングコミットがある時点でガベージコレクションされるため、注意してください。

3

Daniel Bauligと似ていますが、benさんのコメントも参考になります。また、ブランチングにtry-XXの規約を使用しているので、ブランチを特定のパターンでフィルタリングします。

for k in $(git branch -r | awk -F/ '/\/YOUR_PREFIX_HERE/{print $2}' | sed /\*/d); do 
    if [ -z "$(git log -1 --since='Jul 31, 2015' -s origin/$k)" ]; then 
    echo deleting "$(git log -1 --pretty=format:"%ct" origin/$k) origin/$k"; 
    git push origin --delete $k; 
    fi; 
done 
1

これが私の仕事です:

for k in $(git branch -r | sed /\*/d); do 
    if [ -z "$(git log -1 --since='Aug 10, 2016' -s $k)" ]; then 
    branch_name_with_no_origin=$(echo $k | sed -e "s/origin\///") 
    echo deleting branch: $branch_name_with_no_origin 
    git push origin --delete $branch_name_with_no_origin 
    fi 
done 

重要な部分は、あなたがGitのプッシュしようと支店名(変数$ k)が、しかし/origin/部品などorigin/feature/my-cool-new-branch が含まれていることです - -delete、それは次のようなエラーで失敗します:
'origin/feature/my-cool-new-branch'を削除できません:リモート参照は存在しません。
したがって、の部分を削除するためにsedを使用します。その結果、feature/my-cool-new-branchのようなブランチ名が残っているので、git push --deleteが機能します。

関連する問題