の出力にリストされているすべてのブランチを削除したい...
$ git branch
...しかし、現在のブランチを1つのステップで維持します。それは可能ですか?もしそうなら、どうですか?
の出力にリストされているすべてのブランチを削除したい...
$ git branch
...しかし、現在のブランチを1つのステップで維持します。それは可能ですか?もしそうなら、どうですか?
回答:
@pankijsの回答に基づいて、2つのgitエイリアスを作成しました。
[alias]
# Delete all local branches but master and the current one, only if they are fully merged with master.
br-delete-useless = "!f(){\
git branch | grep -v "master" | grep -v ^* | xargs git branch -d;\
}; f"
# Delete all local branches but master and the current one.
br-delete-useless-force = "!f(){\
git branch | grep -v "master" | grep -v ^* | xargs git branch -D;\
}; f"
追加される ~/.gitconfig
そして、@ torekが指摘したように:
小文字
-d
は「完全にマージされていない」ブランチを削除しないことに注意してください(ドキュメントを参照)。を使用-D
すると、このようなブランチが削除されます。これにより、コミットが「失われる」場合があります。これはブランチのreflogsも削除するため、注意して使用してください。これにより、通常の「偶発的な削除からの回復」機能も機能しなくなります。
基本的に、-force
重要なものを失うことがないと300%確信できない場合は、このバージョンを使用しないでください。永遠に失われているからです。
git branch branchname commitid
$ git branch | grep -v "master" | xargs git branch -D
マスター以外のすべてのブランチを削除します(マスターを保持したいブランチに置き換えますが、マスターを削除します)
grep -v ^*
。
master-copy
たとえば、というブランチは削除されません
grep -v "^ *master$"
grep -v "master\|my-other-branch"
。
最初に(保持したいブランチに切り替え> ex:master):
git checkout master
2番目(マスターであることを確認してください)
git branch -D $(git branch)
git branch -D $(git branch).Trim()
。
git branch -d
(または-D
)は複数のブランチ名を許可しますが、少なくとも少しのコードを記述せずに「現在のブランチを除くすべてのローカルブランチ」を自動的に提供するのは少しトリッキーです。
「最良の」(正式に正しい)メソッドはgit for-each-ref
、ブランチ名を取得するために使用することです。
git for-each-ref --format '%(refname:short)' refs/heads
しかし、どのブランチにいるのかを理解するのはさらに困難です(git symbolic-ref HEAD
派手なスクリプトを作成する場合は、これに対する "正式に正しい"メソッドです)。
より便利なのは、を使用してgit branch
、2つのスペースまたは(現在のブランチの場合は)アスタリスクを前に付けたローカルブランチ名を出力すること*
です。したがって、*
バージョンを削除するためにこれを実行すると、スペースで区切られたブランチ名が残り、それを次に渡すことができますgit branch -d
。
git branch -d $(git branch | grep -v '^*')
または:
git branch | grep -v '^*' | xargs git branch -d
小文字-d
は「完全にマージされていない」ブランチを削除しないことに注意してください(ドキュメントを参照)。を使用-D
すると、コミットが「失われる」原因になっても、そのようなブランチが削除されます。これはブランチのreflogも削除するため、注意して使用してください。これにより、通常の「偶発的な削除からの回復」機能も機能しなくなります。
git branch -D $(git branch | grep -v '^*')
マージしたブランチを削除したい場合は、にする必要があります。
マージされたすべてのブランチを削除するには(currentを除く-v ‘*’
):
git branch --merged | grep -v '*' | xargs git branch -D
また、私はリポジトリの完全なクリーンアップのためにそのようなコマンドを作りました:
alias git-clean="git branch | grep -v '*' | grep -v 'master' | xargs git branch -D && git reset --hard && git clean -d -x -f"
この環境をWindows環境用に作成したことがあります。多分それは誰かを助けるでしょう。実行中、マスターブランチと現在のブランチは削除されません。他のすべてのマージされたブランチは関係なく削除されます。
@echo off
cd PATH_TO_YOUR_REPO
REM -- Variable declerations
set "textFile=tempBranchInfo.txt"
set "branchToKeep=master"
set "branchToReplaceWith="
git branch --merged > %textFile%
REM -- remove "master" from list to keep the branch
for /f "delims=" %%i in ('type "%textFile%" ^& break ^> "%textFile%" ') do (
set "line=%%i"
setlocal enabledelayedexpansion
>>"%textFile%" echo(!line:%branchToKeep%=%branchToReplaceWith%!
endlocal
)
REM -- execute branch delete commands
for /f "delims=" %%a in (%textFile%) do (
git branch -D %%a
)
REM -- remove temp-file with branch information inside
DEL %textFile%
REM -- show local branches after the cleaning
echo Local branches:
git branch
pause
exit
だから、ここにハードコーディングされたブランチ名がたくさんあります...そして、私の答えは、質問の「現在のブランチ」の部分に対してより正確である一方、私のような初心者を一行で読みやすくするために読みやすくしています。正当な理由で信用を置くために、答えは明らかに@pankijsの答えにも基づいています。
git branch | grep -v $(git branch --show-current) | xargs git branch -d
また、debianの.bash_aliasesの1行にエイリアスを設定しています。
alias gitbclean='git branch | grep -v $(git branch --show-current) | xargs git branch -d'
(サブコマンドをいくつかのコマンドラインで実行するには、いくつかのbash機能を有効にする必要があると思いますが)
削除したくないものをより選択できるようになるので、これを使用します。以下のコマンドは、master、develop、および現在のブランチを除くすべてのブランチを削除します。
BRANCHES=$(git branch | egrep -v "(master|develop|\*)" | xargs git branch -D)
echo $BRANCHES
だから私はこれを私の中に入れました ~/.zshrc
delete_branches() {
BRANCHES=$(git branch | egrep -v "(master|develop|\*)" | xargs git branch -D)
echo $BRANCHES
}
alias cleanup_branches=delete_branches
私見、ローカルブランチを削除する最も安全な方法は:
git branch -av | grep "\[gone\]" | awk '{print $1}' | xargs git branch -d
また、このトピックに関連する詳細情報を見つけることができますすべてのローカルgitブランチを削除します
gone
使用する必要があるマーカーを印刷するには-vv
(詳細2回)、-a
助けにはなりません(リモートブランチも一覧表示されます)