私は通常、すでに16個の回答がある質問には答えませんが、他のすべての答えは間違っており、正しい答えはとても簡単です。質問には、「リモートで同等のものが存在しないすべての追跡ブランチを削除する簡単な方法はありますか?」とあります。
「単純」とは、脆弱性や危険性がなく、すべての読者が持っているわけではないツールに依存せずに、すべてを一度に削除することを意味する場合、正しい答えは次のとおりです。
いくつかの答えは単純ですが、彼らは求められたことをしません。他の人は求められたことを行いますが、単純ではありません。すべてのシステムに存在するとは限らない、テキスト操作コマンドまたはスクリプト言語によるGit出力の解析に依存しています。その上、ほとんどの提案は磁器コマンドを使用しており、その出力はスクリプトによって解析されるようには設計されていません(「磁器」とは人間の操作を目的としたコマンドを指します。スクリプトは下位レベルの「配管」コマンドを使用する必要があります)。
参考文献:
これを安全に行うには、質問のユースケース(サーバーで削除されたがローカルブランチとして存在するガベージコレクショントラッキングブランチ)で、高レベルのGitコマンドのみを使用する場合、
git fetch --prune
(またはgit fetch -p
、これはエイリアスであるか、git prune remote origin
フェッチせずに同じことを行うため、ほとんどの場合、たいていは必要ありません)。
- 削除されたと報告されているすべてのリモートブランチに注意してください。または、後でそれらを見つけるには
git branch -v
(孤立した追跡ブランチはすべて[[gone] "とマークされます)。
git branch -d [branch_name]
孤立した追跡ブランチごとに
(これは他の回答のいくつかが提案しているものです)。
ソリューションをスクリプト化する場合for-each-ref
は、ここからが出発点です。MarkLongairのここでの回答と別の質問に対するこの回答のように、シェルスクリプトループを記述したり、xargsや何かを使用したりせずに解決策を利用する方法はありません。
背景説明
何が起こっているのかを理解するには、ブランチを追跡する状況では、ブランチが1つではなく3つあることを理解する必要があります。(そして、「ブランチ」は単にコミットへのポインタを意味することを思い出してください。)
追跡ブランチを指定するfeature/X
と、リモートリポジトリ(サーバー)にこのブランチがあり、それを呼び出しますfeature/X
。ローカルリポジトリにはブランチがremotes/origin/feature/X
あります。つまり、「これは、リモートがその機能/ Xブランチについて、前回話したときのことです」という意味です。最後に、ローカルリポジトリには、feature/X
最新のコミットを指すブランチがあり、 "追跡"remotes/origin/feature/X
、引っ張ったり押したりして、それらを整列させたままにできることを意味します。
ある時点で、誰かがfeature/X
リモートでを削除しました。その瞬間から、あなたはあなたのローカルfeature/X
(機能Xでの作業はおそらく終了しているのでおそらくもう望まないでしょう)を残し、あなたのローカルremotes/origin/feature/X
はサーバーのブランチの状態を記憶することだけだったので確かに役に立たない。
そしてGitはあなたに冗長なものを自動的にクリーンアップさせますremotes/origin/feature/X
-それが何をするかですgit fetch --prune
-しかし何らかの理由でそれはあなたがあなた自身のものを自動的に削除することを許しませんfeature/X
...あなたがfeature/X
まだ孤立した追跡情報を含んでいるので、それは情報を持っています完全にマージされた以前の追跡ブランチを識別するため。(結局のところ、自分で操作できるような情報が得られます。)
* master
私のシステムにあります。次のコマンドは、私の仕事:git branch -d $(git branch --merged |tail -n +2)