私はたくさんのGitブランチを持っています。既にマージされているブランチを削除する方法1つずつ削除するのではなく、すべて削除する簡単な方法はありますか?
更新:
ワークフローに先祖としてそれらがある場合、masterやdevのように除外するために他のブランチを追加することができます。通常、私は "sprint-start"タグとマスターから分岐し、devとqaは先祖ではありません。
まず、リモートでマージされたブランチをすべてリストします。
git branch --merged
削除したくないブランチがいくつかあるかもしれません。マスターやディベロップメントのように削除したくない重要なブランチをスキップするための引数をいくつか追加できます。次のコマンドはmasterブランチとそれにdevがあるものはすべてスキップします。
git branch --merged| egrep -v "(^\*|master|dev)"
スキップしたい場合は、次のようにegrepコマンドに追加できます。ブランチskip_branch_name
は削除されません。
git branch --merged| egrep -v "(^\*|master|dev|skip_branch_name)"
現在チェックアウトされているブランチにすでにマージされているすべてのローカルブランチを削除するには、次の手順を実行します。
git branch --merged | egrep -v "(^\*|master|dev)" | xargs git branch -d
祖先である場合は、masterとdevが除外されていることがわかります。
マージしたローカルブランチを削除することができます。
git branch -d branchname
マージされていない場合は、
git branch -D branchname
Gitの古いバージョンでリモートからそれを削除するには:
git Push Origin :branchname
Gitの最近のバージョンでは、
git Push --delete Origin branchname
リモートからブランチを削除したら、Pruneでリモートトラッキングブランチを取り除くことができます。
git remote Prune Origin
または他の答えが示すように、個々のリモート追跡ブランチを次のようにプルーニングします。
git branch -dr branchname
お役に立てれば。
既にマージされているremote上のすべてのブランチを削除するには
git branch -r --merged | grep -v master | sed 's/Origin\//:/' | xargs -n 1 git Push Origin
Gitのより最近のバージョンでは
git branch -r --merged | grep -v master | sed 's/Origin\///' | xargs -n 1 git Push --delete Origin
Adamの答えを少しだけ拡張します。
git config -e --global
を実行してこれをGit設定に追加します。
[alias]
cleanup = "!git branch --merged | grep -v '\\*\\|master\\|develop' | xargs -n 1 git branch -d"
そして、単純なgit cleanup
を実行して、すべてのローカルマージブランチを削除できます。
これはmaster以外の全てのマージされたブランチを削除するのにも働きます。
git branch --merged | grep -v '^* master$' | grep -v '^ master$' | xargs git branch -d
これらのコマンドからmaster
とdevelop
のブランチを除外したいでしょう。
ローカルGitのクリア:
git branch --merged | grep -v '\*\|master\|develop' | xargs -n 1 git branch -d
リモートGitのクリア:
git branch -r --merged | grep -v '\*\|master\|develop' | sed 's/Origin\///' | xargs -n 1 git Push --delete Origin
リモートブランチのローカルレジストリを同期します。
git fetch -p
Windows上にいてPowerShellスクリプトを好む人のために、ローカルのマージされたブランチを削除するものがあります。
function Remove-MergedBranches
{
git branch --merged |
ForEach-Object { $_.Trim() } |
Where-Object {$_ -NotMatch "^\*"} |
Where-Object {-not ( $_ -Like "*master" )} |
ForEach-Object { git branch -d $_ }
}
Git Sweep これは素晴らしい仕事をする。
Gitバージョン2.5.0を使う:
git branch -d `git branch --merged`
私は何年もの間Adamの答えを使ってきました。それは言った、それは私が予想したように振舞わなかったいくつかのケースがあるということです:
1と2は、正規表現を変更するだけで、簡単に対処できます。 3はあなたが望むもののコンテキストに依存します(すなわち、masterにマージされなかったブランチ、または現在のブランチに対して削除されたブランチのみを削除します)。意図せずにデタッチされたHEAD状態で実行した場合はgit reflog
)。
最後に、私はこれをすべて別の(Bash | Ruby | Python)スクリプトを必要としないワンライナーにすることを望みました。
オプションの-f
フラグを受け付けるgitエイリアス "sweep"を作成してください。
git config --global alias.sweep '!f(){ git branch --merged $([[ $1 != "-f" ]] \
&& git rev-parse master) | egrep -v "(^\*|^\s*(master|develop)$)" \
| xargs git branch -d; }; f'
そしてそれを呼び出してください:
git sweep
または
git sweep -f
いくつかのブランチを含むgitリポジトリの例を作成し、正しい動作をテストすることが最も簡単でした。
mkdir sweep-test && cd sweep-test && git init
echo "hello" > hello
git add . && git commit -am "initial commit"
git branch foo && git branch bar && git branch develop && git branch notmaster && git branch masterful
git branch --list
bar develop foo * master masterful notmaster
元の正規表現では、ブランチ "masterful"と "notmaster"がありません。
git checkout foo
git branch --merged | egrep -v "(^\*|master|dev)"
bar
更新された正規表現(これで "dev"ではなく "Develop"が除外されました):
git branch --merged | egrep -v "(^\*|^\s*(master|develop)$)"
bar masterful notmaster
echo "foo" > foo
git add . && git commit -am "foo"
git checkout -b foobar
echo "foobar" > foobar
git add . && git commit -am "foobar"
私の現在のブランチはfoobarなので、削除したいブランチをリストするために上記のコマンドを再実行すると、masterにマージされていなくてもブランチ "foo"が含まれます。
git branch --merged | egrep -v "(^\*|^\s*(master|develop)$)"
bar foo masterful notmaster
しかし、masterで同じコマンドを実行すると、ブランチ "foo"は含まれません。
git checkout master && git branch --merged | egrep -v "(^\*|^\s*(master|develop)$)"
bar masterful notmaster
そして、これは単にgit branch --merged
が他に指定されていなければ現在のブランチのHEADをデフォルトとするからです。少なくとも私のワークフローでは、ローカルブランチがmasterにマージされていない限り、ローカルブランチを削除したくないので、私は次のような方法を好みます。
git checkout foobar
git branch --merged $(git rev-parse master) | egrep -v "(^\*|^\s*(master|develop)$)"
bar masterful notmaster
git branch --merged
のデフォルトの振る舞いに頼ることは切り離されたHEAD状態においてさらに重要な結果をもたらします:
git checkout foobar
git checkout HEAD~0
git branch --merged | egrep -v "(^\*|^\s*(master|develop)$)"
bar foo foobar masterful notmaster
これは私が今行っていたブランチ "foobar"と "foo"を削除したはずですが、これはほぼ確実に望ましい結果ではありません。
git branch --merged $(git rev-parse master) | egrep -v "(^\*|^\s*(master|develop)$)"
bar masterful notmaster
git branch --merged $(git rev-parse master) | egrep -v "(^\*|^\s*(master|develop)$)" | xargs git branch -d
git config --global alias.sweep '!f(){ git branch --merged $([[ $1 != "-f" ]] \
&& git rev-parse master) | egrep -v "(^\*|^\s*(master|develop)$)" \
| xargs git branch -d; }; f'
別名はオプションの-f
フラグを受け入れます。デフォルトの動作ではmasterにマージされたブランチだけが削除されますが、-f
フラグは現在のブランチにマージされたブランチを削除します。
git sweep
Deleted branch bar (was 9a56952). Deleted branch masterful (was 9a56952). Deleted branch notmaster (was 9a56952).
git sweep -f
Deleted branch foo (was 2cea1ab).
コミットを--mergedオプションに追加することができます。
以下のコマンドはあなたのOriginからマージされたブランチを削除します。
git branch -r --merged Origin/master | grep -v "^.*master" | sed s:Origin/:: |xargs -n 1 git Push Origin --delete
Git Push Origin --deleteをechoに置き換えて、どのブランチが削除されるのかをテストできます。
git branch -r --merged Origin/master | grep -v "^.*master" | sed s:Origin/:: |xargs -n 1 echo
次のRubyスクリプトを使って、既にマージされているローカルブランチとリモートブランチを削除します。複数のリモートを持つリポジトリに対してそれを実行していて、1つだけから削除したい場合は、必要なリモートのみを取得するために、リモートステートメントリストにselectステートメントを追加します。
#!/usr/bin/env Ruby
current_branch = `git symbolic-ref --short HEAD`.chomp
if current_branch != "master"
if $?.exitstatus == 0
puts "WARNING: You are on branch #{current_branch}, NOT master."
else
puts "WARNING: You are not on a branch"
end
puts
end
puts "Fetching merged branches..."
remote_branches= `git branch -r --merged`.
split("\n").
map(&:strip).
reject {|b| b =~ /\/(#{current_branch}|master)/}
local_branches= `git branch --merged`.
gsub(/^\* /, '').
split("\n").
map(&:strip).
reject {|b| b =~ /(#{current_branch}|master)/}
if remote_branches.empty? && local_branches.empty?
puts "No existing branches have been merged into #{current_branch}."
else
puts "This will remove the following branches:"
puts remote_branches.join("\n")
puts local_branches.join("\n")
puts "Proceed?"
if gets =~ /^y/i
remote_branches.each do |b|
remote, branch = b.split(/\//)
`git Push #{remote} :#{branch}`
end
# Remove local branches
`git branch -d #{local_branches.join(' ')}`
else
puts "No branches removed."
end
end
git branch --merged | %{git branch -d $_.Trim()}
GitHub for Windows を参照してください。
Gitにはこれを自動的に実行するコマンドはありません。しかし、Gitコマンドを使って必要なものを提供するスクリプトを書くことができます。これは、使用している分岐モデルに応じてさまざまな方法で実行できます。
もしブランチがmasterにマージされたかどうかを知る必要があるなら、myTopicBranchがマージされていれば次のコマンドは何も出力しません(すなわちあなたはそれを削除することができます)。
$ git rev-list master | grep $(git rev-parse myTopicBranch)
Git branchコマンドを使用してBash内のすべてのブランチを解析し、すべてのブランチに対してfor
ループを実行できます。このループでは、ブランチを削除できるかどうかを上記のコマンドで確認します。
kuboonの回答では、ブランチ名にWordのマスターが含まれているブランチの削除に失敗しました。
git branch -r --merged | grep -v "Origin/master$" | sed 's/\s*Origin\///' | xargs -n 1 git Push --delete Origin
もちろん、 "master"ブランチ自体は削除されません:)
git branch --merged | grep -Ev '^(. master|\*)' | xargs -n 1 git branch -d
は、現在チェックアウトされているブランチやmaster
を除くすべてのローカルブランチを削除します。
これらのコマンドを理解したい人のために役立つ記事を以下に示します。 Git Clean:すでにマージされたブランチを削除、スティーブンハーマン 。
git-del-br
tool を使うことができます。
git-del-br -a
pip
経由でインストールできます。
pip install git-del-br
P.S:私はツールの作者です。任意の提案/フィードバックは大歓迎です。
エイリアスバージョンの Adamの最新の回答 :
[alias]
branch-cleanup = "!git branch --merged | egrep -v \"(^\\*|master|dev)\" | xargs git branch -d #"
また、複雑なエイリアスをエスケープするための便利なヒントについては、 この回答 をご覧ください。
あなたが現在いるブランチに既にマージされているすべてのローカルブランチを削除したいのであれば、私は以前の答えに基づいてそうするための安全なコマンドを思いついた。
git branch --merged | grep -v \* | grep -v '^\s*master$' | xargs -t -n 1 git branch -d
このコマンドは現在のブランチやマスターブランチには影響しません。 xargsの-tフラグを使用して、実行する前に実行していることもわかります。
次のコマンドを試してください。
git branch -d $(git branch --merged | grep -vw $(git rev-parse --abbrev-ref HEAD))
git rev-parse
を使用すると、 現在のブランチ名 が除外されます。エラーが発生した場合は、削除するローカルブランチがないことを意味します。
リモートブランチでも同じようにするには(リモート名でOrigin
を変更します)、
git Push Origin -vd $(git branch -r --merged | grep -vw $(git rev-parse --abbrev-ref HEAD) | cut -d/ -f2)
複数のリモートを使用している場合は、cut
の前にgrep Origin |
を追加してOrigin
のみをフィルタリングします。
上記のコマンドが失敗した場合は、最初にマージされたリモートトラッキングブランチを削除してみてください。
git branch -rd $(git branch -r --merged | grep -vw $(git rev-parse --abbrev-ref HEAD))
その後、リモコンをもう一度git fetch
して、前のgit Push -vd
コマンドをもう一度使用します。
頻繁に使用する場合は、~/.gitconfig
ファイルにエイリアスとして追加することを検討してください。
誤っていくつかのブランチを削除した場合は、git reflog
を使って失われたコミットを見つけてください。
以下のクエリは私のために働きます
for branch in `git branch -r --merged | grep -v '\*\|master\|develop'|awk 'NR > 0 {print$1}'|awk '{gsub(/Origin\//, "")}1'`;do git Push Origin --delete $branch; done
これにより、grepパイプ内の特定のブランチがフィルタリングされます。
Http cloneを介してはうまく機能しますが、ssh接続ではあまりうまくいきません。
私が作ったこれらの答えのいくつかに基づいて それをするための私自身のBashスクリプト !
マージされたブランチを削除するためにgit branch --merged
とgit branch -d
を使い、削除する前にそれぞれのブランチについてプロンプトを出します。
merged_branches(){
local current_branch=$(git rev-parse --abbrev-ref HEAD)
for branch in $(git branch --merged | cut -c3-)
do
echo "Branch $branch is already merged into $current_branch."
echo "Would you like to delete it? [Y]es/[N]o "
read REPLY
if [[ $REPLY =~ ^[Yy] ]]; then
git branch -d $branch
fi
done
}
私はgit-flowのような命名法を使っていますので、これは私にとって非常に安全に動作します。
git branch --merged | grep -e "^\s\+\(fix\|feature\)/" | xargs git branch -d
基本的には文字列fix/
またはfeature/
で始まるマージされたコミットを探します。
Gitがmasterにマージされたすべてのブランチをチェックアウトするスクリプトを書きます。
それからgit checkout master
をしてください。
最後に、マージした枝を削除します。
for k in $(git branch -ra --merged | egrep -v "(^\*|master)"); do
branchnew=$(echo $k | sed -e "s/Origin\///" | sed -e "s/remotes\///")
echo branch-name: $branchnew
git checkout $branchnew
done
git checkout master
for k in $(git branch -ra --merged | egrep -v "(^\*|master)"); do
branchnew=$(echo $k | sed -e "s/Origin\///" | sed -e "s/remotes\///")
echo branch-name: $branchnew
git Push Origin --delete $branchnew
done
受け入れられている解決策はかなり良いですが、それがまだリモートにマージされていないローカルブランチも削除するという1つの問題があります。
あなたがあなたの出力を見ると、こんな感じになるでしょう
$ git branch --merged master -v
api_doc 3a05427 [gone] Start of describing the Java API
bla 52e080a Update wording.
branch-1.0 32f1a72 [maven-release-plugin] prepare release 1.0.1
initial_proposal 6e59fb0 [gone] Original proposal, converted to AsciiDoc.
issue_248 be2ba3c Skip unit-for-type checking. This needs more work. (#254)
master be2ba3c Skip unit-for-type checking. This needs more work. (#254)
ブランチbla
とissue_248
は、静かに削除されるローカルブランチです。
しかし、[gone]
という単語を見ることもできます。これは、リモートにプッシュされたブランチ(現在は消えている)を示しているため、ブランチを削除できることを示します。
元の答えはこのように変更することができます(短い行の長さのために複数行に分割)
git branch --merged master -v | \
grep "\\[gone\\]" | \
sed -e 's/^..//' -e 's/\S* .*//' | \
xargs git branch -d
まだマージされていないブランチを保護するために。これを保護するためのmasterのgrepは必要ありません。これはOriginにリモートがあり、なくなったようには見えないからです。
Windowsの場合、 Cygwin をインストールして、次のコマンドを使用してすべてのリモートブランチを削除できます。
git branch -r --merged | "C:\cygwin64\bin\grep.exe" -v master | "C:\cygwin64\bin\sed.exe" 's/Origin\///' | "C:\cygwin64\bin\xargs.exe" -n 1 git Push --delete Origin
私にとってgit branch --merged
は、GitHub PRを介してマージされたブランチを表示しません。理由はわかりませんが、次の行を使用して削除しますリモートトラッキングブランチを持たないすべてのローカルブランチ:
diff <(git branch --format "%(refname:short)") <(git branch -r | grep -v HEAD | cut -d/ -f2-) | grep '<' | cut -c 3- | xargs git branch -D
説明:
git branch --format "%(refname:short)"
はローカルブランチのリストを提供しますgit branch -r | grep -v HEAD | cut -d/ -f2-
はリモートブランチのリストを提供し、HEAD
を除外しますdiff <(...) <(...)
は、括弧内の2つのコマンドの出力の差分を提供しますgrep '<'
は、最初のリストには存在するが2番目のリストには存在しないブランチをフィルターしますcut -c 3-
は3番目の文字から始まる行を与えるため、接頭辞<
を削除しますxargs git branch -D
は各ブランチ名に対してgit branch -D
を実行しますまたは、次のようにgrep -v '<'
を回避できます:
diff --old-line-format="%L" --new-line-format="" --unchanged-line-format="" <(git branch --format "%(refname:short)") <(git branch -r | grep -v HEAD | cut -d/ -f2-) | xargs git branch -D
git branch --merged | grep -E -v "(master|test|dev)" | xargs git branch -d
grep -E -v
はegrep -v
と同じです。
-d
を使用してすでに merged branchesを削除するか、 -D
を使用して unmerged branchesを削除します
誤ってmaster以外のブランチからコマンドを実行しないように、次のbashスクリプトを使用します。そうでなければ、masterからマージされたブランチからgit branch --merged | grep -v "\*" | xargs -n 1 git branch -d
を実行すると、マスターブランチが削除される可能性があります。
#!/bin/bash
branch_name="$(git symbolic-ref HEAD 2>/dev/null)" ||
branch_name="(unnamed branch)" # detached HEAD
branch_name=${branch_name##refs/heads/}
if [[ $branch_name == 'master' ]]; then
read -r -p "Are you sure? [y/N] " response
if [[ $response =~ ^([yY][eE][sS]|[yY])$ ]]; then
git branch --merged | grep -v "\*" | xargs -n 1 git branch -d
fi
else
echo "Refusing to delete branches that are not merged into '$branch_name'. Checkout master first."
fi
これをあなたの[alias]
の~/.gitconfig
セクションに追加してください:
sweep = !"f() { git branch --merged | egrep -v \"(^\\*|master|dev)\" || true | xargs git branch -d; }; f"
これで、必要なクリーンアップを実行するためにgit sweep
を呼び出すことができます。
マスターブランチにマージされたローカルブランチを削除するには、次のエイリアス(git config -e --global
)を使います。
cleanup = "!git branch --merged master | grep -v '^*\\|master' | xargs -n 1 git branch -D"
私の現在のチェックアウトはマスターブランチとは異なりますが、私はgit branch -D
メッセージを避けるためにerror: The branch 'some-branch' is not fully merged.
を使用しています。
WindozeにやさしいPythonスクリプト(git-sweep
がWesnothリポジトリで詰まったため)
#!/usr/bin/env python
# Remove merged git branches. Cross-platform way to execute:
#
# git branch --merged | grep -v master | xargs git branch -d
#
# Requires gitapi - https://bitbucket.org/haard/gitapi
# License: Public Domain
import gitapi
repo = gitapi.Repo('.')
output = repo.git_command('branch', '--merged').strip()
for branch in output.split('\n'):
branch = branch.strip()
if branch.strip(' *') != 'master':
print(repo.git_command('branch', '-d', branch).strip())
HubFlowやGitFlowなどの分岐モデルを使用している場合は、このコマンドを使用してマージされた機能分岐を削除できます。
git branch --merged | grep feature.* | grep -v "\*" | xargs -n 1 git branch -d
これはgit branchを削除する方法です
git branch -D BranchName
私のBashスクリプトへの貢献 は、 mmrobinの回答におおまかに基づいています 。
Includeとexcludeを指定したり、両方ではなくローカルブランチまたはリモートブランチだけを調べたり削除したりするために、いくつかの便利なパラメータを取ります。
#!/bin/bash
# exclude branches regex, configure as "(branch1|branch2|etc)$"
excludes_default="(master|next|ag/doc-updates)$"
excludes="__NOTHING__"
includes=
merged="--merged"
local=1
remote=1
while [ $# -gt 0 ]; do
case "$1" in
-i) shift; includes="$includes $1" ;;
-e) shift; excludes="$1" ;;
--no-local) local=0 ;;
--no-remote) remote=0 ;;
--all) merged= ;;
*) echo "Unknown argument $1"; exit 1 ;;
esac
shift # next option
done
if [ "$includes" == "" ]; then
includes=".*"
else
includes="($(echo $includes | sed -e 's/ /|/g'))"
fi
current_branch=$(git branch --no-color 2> /dev/null | sed -e '/^[^*]/d' -e 's/* \(.*\)/\1/')
if [ "$current_branch" != "master" ]; then
echo "WARNING: You are on branch $current_branch, NOT master."
fi
echo -e "Fetching branches...\n"
git remote update --Prune
remote_branches=$(git branch -r $merged | grep -v "/$current_branch$" | grep -v -E "$excludes" | grep -v -E "$excludes_default" | grep -E "$includes")
local_branches=$(git branch $merged | grep -v "$current_branch$" | grep -v -E "$excludes" | grep -v -E "$excludes_default" | grep -E "$includes")
if [ -z "$remote_branches" ] && [ -z "$local_branches" ]; then
echo "No existing branches have been merged into $current_branch."
else
echo "This will remove the following branches:"
if [ "$remote" == 1 -a -n "$remote_branches" ]; then
echo "$remote_branches"
fi
if [ "$local" == 1 -a -n "$local_branches" ]; then
echo "$local_branches"
fi
read -p "Continue? (y/n): " -n 1 choice
echo
if [ "$choice" == "y" ] || [ "$choice" == "Y" ]; then
if [ "$remote" == 1 ]; then
remotes=$(git remote)
# Remove remote branches
for remote in $remotes
do
branches=$(echo "$remote_branches" | grep "$remote/" | sed "s/$remote\/\(.*\)/:\1 /g" | tr -d '\n')
git Push $remote $branches
done
fi
if [ "$local" == 1 ]; then
# Remove local branches
locals=$(echo "$local_branches" | sed 's/Origin\///g' | tr -d '\n')
if [ -z "$locals" ]; then
echo "No branches removed."
else
git branch -d $(echo "$locals" | tr -d '\n')
fi
fi
fi
fi
Windowsを使用している場合は、 Out-GridView を使用してWindows Powershellを使用して(残念ながら、現在Powershell Coreには存在しません)、分岐の良いリストを表示し、削除したいブランチをマウスで選択できます。
git branch --merged | Out-GridView -PassThru | % { git branch -d $_.Trim() }
for b in $(git branch -a | grep -v "\(master\|remotes\)"); do \
git branch -D $b; done && git fetch -p
git-delete-merged-branches
repoからのgit-extras
。
https://github.com/tj/git-extras/blob/master/Commands.md#git-delete-merged-branches
私は、upstreamという名前のリモートとOriginを持っているとしましょう(GitHubスタイル、私のforkはOrigin、上流は上流です)。
私はどんなマスター、HEAD、あるいは上流からの何かを削除したくありません。それは私達がPRを作成する私達の共通の枝であるので、私はまた現像枝を削除したくない。
マージされたものでフィルタリングされたすべてのリモートブランチを一覧表示します。
git branch -r
そのリストから、削除したくないブランチ名にあることがわかっている単語を含む行を削除します。
sed '/develop\|master\|HEAD\|upstream/d'
参照名からリモート名を削除します(Origin/somebranchはsomebranchになります)。
sed 's/.*\///'
Xargsを使ってワンライナーを呼び出す:
xargs git Push --delete Origin
あなたが得るすべて一緒にそれをパイプ:
git branch -r --merged | sed '/develop\|master\|HEAD\|upstream/d' | sed 's/.*\///' | xargs git Push --delete Origin
これは私が取り組んできたがマージしていないいくつかのブランチだけを私に残すでしょう。多すぎてはいけないので、それらを一つずつ削除することができます。
不要になったブランチを探します。
git branch -ar
削除したいbranch1、branch2、およびbranch3が見つかったとします。
git Push --delete Origin branch1 branch2 branch3
$ git config --global alias.cleanup
'!git branch --merged Origin/master | egrep -v "(^\*|master|staging|dev)" | xargs git branch -d'
(読みやすくするために複数行に分割)
"git cleanup"を呼び出すと、既にOrigin/masterにマージされているローカルブランチが削除されます。通常の状況ではそれらを削除したくないため、master、staging、およびdevはスキップされます。
これを打破して、これはそれがしていることです:
git config --global alias.cleanup
!
は、このエイリアスの一部としてgit以外のコマンドを使用することになっているので、実際にはbashコマンドをここで実行する必要がありますgit branch --merged Origin/master
Origin/master
にマージされているブランチ名のリストを返します。egrep -v "(^\*|master|staging|dev)"
xargs git branch -d
git branch -d xxxxx
コマンドが実行されます。これにより、ローカルブランチが1つずつ削除されます。私は1つのcmdでマージされたローカルANDリモートブランチを削除するに以下のメソッドを使っています。
bashrc
ファイルには以下のものがあります。
function rmb {
current_branch=$(git branch --no-color 2> /dev/null | sed -e '/^[^*]/d' -e 's/* \(.*\)/\1/')
if [ "$current_branch" != "master" ]; then
echo "WARNING: You are on branch $current_branch, NOT master."
fi
echo "Fetching merged branches..."
git remote Prune Origin
remote_branches=$(git branch -r --merged | grep -v '/master$' | grep -v "/$current_branch$")
local_branches=$(git branch --merged | grep -v 'master$' | grep -v "$current_branch$")
if [ -z "$remote_branches" ] && [ -z "$local_branches" ]; then
echo "No existing branches have been merged into $current_branch."
else
echo "This will remove the following branches:"
if [ -n "$remote_branches" ]; then
echo "$remote_branches"
fi
if [ -n "$local_branches" ]; then
echo "$local_branches"
fi
read -p "Continue? (y/n): " -n 1 choice
echo
if [ "$choice" == "y" ] || [ "$choice" == "Y" ]; then
# Remove remote branches
git Push Origin `git branch -r --merged | grep -v '/master$' | grep -v "/$current_branch$" | sed 's/Origin\//:/g' | tr -d '\n'`
# Remove local branches
git branch -d `git branch --merged | grep -v 'master$' | grep -v "$current_branch$" | sed 's/Origin\///g' | tr -d '\n'`
else
echo "No branches removed."
fi
fi
}
オリジナル ソース
これはマスターブランチを削除するのではなく、マージされたローカルANDリモートブランチを削除するです。これをrcファイルに入れたら、rmb
を実行するだけで、マージされたブランチが失われたことが示されます。確認を求めないようにコードを変更することもできますが、それを保持しておくのはおそらく良いことです。
マージされたローカルブランチを削除したいのであれば、ここで私が好むワンライナーがここにあります:
git branch --merged | xargs -I_br -- sh -c 'git branch -d _br; git Push Origin --delete _br'