1. ホーム
  2. git

[解決済み] git remote prune - 思っていたより剪定されたブランチが表示されませんでした。

2022-09-07 05:36:54

質問

manページより。

Deletes all stale tracking branches under <name>.
These stale branches have already been removed from the remote repository
referenced by <name>, but are still locally available in "remotes/<name>".

というわけで

git push origin :staleStuff

を実行し

git remote prune origin

しかし、刈り込まれたのは1つのローカルブランチだけでした。これらのブランチのいくつかは私が作成したものであり、いくつかは同僚が作成したものです。これは、私が最初にそれらのブランチを正しく追跡していなかったことを示しているのでしょうか?

どのように解決するのですか?

を使用する場合 git push origin :staleStuff を使うと、自動的に origin/staleStuff を実行すると git remote prune origin を実行したとき、あなたは他の誰かによって削除されたいくつかの枝を剪定したことになります。それよりも、あなたの同僚が今すぐ git prune を実行して、あなたが削除した枝を取り除く必要があります。


では、具体的にどのような git remote prune は何をするのでしょうか?主な内容: ローカルブランチ (トラッキングブランチではない) には git remote prune コマンドでは触れないので、手動で削除する必要があります。

では、理解を深めるために実例を挙げてみましょう。

2つのブランチを持つリモートリポジトリがあるとします。 masterfeature . 両方のブランチで作業していると仮定して、その結果、ローカルリポジトリにこれらの参照があるとします(混乱を避けるために完全な参照名を与えています)。

  • refs/heads/master (短い名前 master )
  • refs/heads/feature (短い名前 feature )
  • refs/remotes/origin/master (短い名前 origin/master )
  • refs/remotes/origin/feature (短い名前 origin/feature )

さて、典型的なシナリオです。

  1. 他の開発者が feature にマージします。 master にマージし feature ブランチをリモートリポジトリから削除します。
  2. デフォルトでは git fetch (または git pull ) を使用する場合、ローカルリポジトリから参照は削除されないので、これら 4 つの参照はすべて残ったままです。
  3. それらをクリーンアップすることを決定し git remote prune origin .
  4. git は以下を検出します。 feature ブランチはもう存在しないので refs/remotes/origin/feature 古い ブランチであり、削除されるべきものです。
  5. これで3つのリファレンスができました。 refs/heads/feature を含む 3 つの参照、つまり git remote prune は削除されないからです。 refs/heads/* の参照を削除しません。

リモート追跡ブランチに関連付けられたローカルブランチを、以下の方法で識別することが可能です。 branch.<branch_name>.merge 設定パラメータで指定します。このパラメータは、実際には何も動作するために必要なものではありません (おそらく git pull を除いて)動作に必要なものではありませんので、欠落している可能性があります。

(コメントから有用な情報を得たので、例とランプを更新しました)