KENTEM TechBlog

建設業のDXを実現するKENTEMの技術ブログです。

git fetch -p でリモートの参照が消えないときの対処法

こんにちは。フロントエンド担当です。最近ゴリラにハマっています。🦍<ウホ

さて、今回は git fetch -p を実行しても古いリモートブランチの参照が消えずに困ったので、対処法を紹介します。

-p オプション

git fetchの -p (--prune) オプションは、リモートの情報をfetchすると同時に、リモートで削除されたブランチの参照をローカルからも削除するためのものです。

もう表示しなくて良いブランチがずっとローカルで表示されると邪魔になるので、それなりの頻度で実行しています。

消えない

入社してしばらくの間は -p での削除を知らず、その当時触っていたコードではずっと実行していませんでした。

久しぶりにそのコードを触る時、git fetch -pを実行すると・・・

実行結果の一部

とたくさん出てきました。大体300個くらい。

消せたと思ったのですが、VSCode上でGit Graphを見てもまだある。更新してみてもまだある。

もう一回git fetch -pすると、また同じだけ出てくる。消えない。

対処

コマンド実行結果をずっと遡ってみると以下のような表示がありました。

実行結果の最初の部分

エラー出てた♨️

.lockファイルが作れないよ!という内容ですね。

File existsと書いてあるので、前に作られた.lockファイルが残ってしまっていて邪魔になっているのかと思い、探したのですが、、、、そんな.lockファイルは存在しません。困りました。

調べてみると、どうやらgitはブランチが増えてくると遅くならないようにまとめてくれるようです。それが packed-refs で、エラーで言われたブランチはこちらに残っていました。

中を見ると対象のブランチ名が、、、2つ。大文字と小文字が違うだけの同じ名前がありました。 これが原因でした。

消したい内容だったため、該当行を削除、再度git fetch -p を実行。

🦍 <消えました!!

同じ名前のブランチを作ることを避ける、こまめに-pで消すなど対策するようにしましょう。

以上です。

※ packed-refsの直接編集は推奨されません。編集でフォーマットを崩したり、編集中にgit操作が行われたりするとgit操作が出来なくなる恐れがあるため、packed-refsのバックアップを取ってから消す、または git update-ref -d refs/remotes/origin/<branch名> で削除するほうが安全です。

おわりに

KENTEMでは、様々な拠点でエンジニアを大募集しています! 建設×ITにご興味頂いた方は、是非下記のリンクからご応募ください。 recruit.kentem.jp career.kentem.jp