世界を動かす技術を、日本語で。

漏洩したCIAの開発者ドキュメントに埋もれていた便利なGitのワンライナーを見つけた

2026年2月20日原文(spencer.wtf)

概要

Vault7で公開されたCIAの内部ドキュメントに含まれていた git運用の小技 について解説。 ローカルリポジトリに溜まる 古いブランチの整理方法 が紹介されている。 従来のmasterからmainへの移行にも対応した コマンドの改良版 も説明。 エイリアス化することで 毎回コマンドを覚えずに実行可能。 日々の作業効率化と リポジトリの整理整頓 が可能。

Vault7のgit小技:ローカルの不要ブランチ一括削除

  • 2017年にWikiLeaksが Vault7 として公開したCIAのハッキングツールと内部ドキュメント
  • 内部開発者向けドキュメントに gitの便利な使い方 が記載
  • 時間とともにローカルリポジトリに 不要なブランチが蓄積 する問題
  • git branchコマンドで一覧表示すると 古いブランチが多数残存
  • 標準コマンドgit branch --mergedマージ済みブランチのリストアップ が可能
  • 1つずつ手動削除は 非効率

CIA流・一括クリーンアップコマンド

  • オリジナルコマンド: git branch --merged | grep -v "\*\|master" | xargs -n 1 git branch -d
    • git branch --merged現在のブランチにマージ済みのローカルブランチを一覧
    • grep -v "\*\|master"現在のブランチ(*)とmasterを除外
    • xargs -n 1 git branch -d残りのブランチを1つずつ安全に削除(未マージは削除されない)

main対応・改良版コマンド

  • 多くのプロジェクトがmainを利用する現状に合わせた アップデート版
  • よく使う他のブランチ(例:develop)も 除外指定が可能
  • コマンド例: git branch --merged origin/main | grep -vE "^\s*(\*|main|develop)" | xargs -n 1 git branch -d
    • origin/main基準で マージ済みブランチを抽出
    • grep -vE "^\s*(\*|main|develop)"mainやdevelopも除外
    • xargs残りを一括削除

エイリアス設定と運用

  • 毎回コマンドを覚える必要をなくすため エイリアス化を推奨
  • 例: alias ciaclean='git branch --merged origin/main | grep -vE "^\s*(\*|main|develop)" | xargs -n 1 git branch -d'
  • リポジトリ内でciacleanと打つだけで 不要ブランチの整理完了
  • デプロイ後や作業区切りごとに 定期実行を推奨

効果とまとめ

  • コマンド一発で 40本以上の不要ブランチが一気に数本に整理
  • 毎週数分の時短と 作業環境の清潔化
  • 小さな工夫で 継続的な生産性向上

Hackerたちの意見

今、TUIにハマってるんだ。何かをもっと簡単にしたいときは、claude-codeを開いてTUIをお願いする。今は、gitのワークツリー管理ツールがあって、追加やリベース、削除ができるんだ。TUIライブラリにはTextualを使ってて、claudeが結構うまく扱ってくれる。特に、かなりのPythonコードをテスト実行できるのがいいね。

それ、完全に時間とトークンの無駄に思えるんだけど、何のメリットがあるの?毎回何かするたびに、Claudeに一発でTUIを作らせるってこと?それって計算リソースと君の時間の無駄じゃない?

自分のために作ってる小さなツールの数がすごいことになってるよ。4.6は、今はちゃんと一発か二発でできるみたいで、あんまり気を使わなくても大丈夫そう。これ、オープンソースにしたの?自分も同じこと考えてたんだけど、依存関係の共有についてちょっと考えたかったんだ。例えば、ブランチを試すためにクイックワークツリーをやるとき、npm installとか時間かかるのは避けたいし。もし共有してくれたら、もちろん期待はしないよ。たとえそれが半端な感じのコードでも。

TUIって何か説明してくれない?聞いたことないんだけど。

どんな便利なTUIを作ったの?自分はそのコンセプトに基本的に反対なんだけど。

クロードが書いたコードをどうやって信頼するの?「もしTUIコードにエラーがあったら、私のGitリポジトリがめちゃくちゃになったらどうしよう」って不安にならない?

じゃあ、Tigはいい感じの長くメンテされているGitのTUIだから、楽しめるかもね!少なくともインスピレーションにはなるかも。

Gitの場合、TUIとしてMagitを強くおすすめするよ。頻繁に行う操作が簡単になるだけじゃなくて、あまりやらない操作もできるようになるし、Gitも教えてくれる!私が楽しんでいるMagitの一つの側面についてのドラフトがここにあるよ: https://entropicthoughts.com/rebasing-in-magit

こんなエイリアスを使ってるよ: prune-local = "!git fetch -p && for branch in $(git branch -vv | awk '/: gone]/{if ($1!="*") print $1}'); do git branch -d $branch; done" 1. リモートから最新の情報を取得して、もう存在しないリモートトラッキングブランチを削除 2. ローカルブランチを列挙して、リモートバージョンがもうないとマークされたやつを選択(現在のブランチは無視) 3. ローカルブランチを安全に削除

似たようなことをやってるけど、削除するブランチを選ぶためにfzfを開くんだ。[1] function fcleanb -d "fzfで削除するブランチを選択する" set -l branches_to_delete ( git for-each-ref --sort=committerdate --format='%(refname:lstrip=2) %(upstream:track)' refs/heads/ | \ egrep '[gone]$' | grep -v "master" | \ awk '{print $1}' | $_FZF_BINARY --multi --exit-0 \ ) for branch in $branches_to_delete git branch -D "$branch" end end [1]: https://github.com/jo-m/dotfiles/blob/29d4cab4ba6a18dc44dcf9...

それに似たようなことをやってるよ。ちょっとおしゃれにオプション引数を受け付けたり、一般的な「メインライン」ブランチ名を扱えるようにして、git lintとしてエイリアスを作ってる。[alias] lint = !git branch --merged ${1-} | grep -v -E -e '^[]?[ ](main|master|[0-9]+.-stable)$' -e '^[*][ ]+' | xargs -r -n 1 git branch --delete だから、git pull --prune && git lintは、履歴統計の中でかなり上位にいるよ。

git branch --mergedの主な問題は、リポジトリがスクワッシュマージを強制している場合、当然うまくいかないことだよね。なぜなら、メインのスクワッシュマージされたコミットのSHAは元のブランチのHEADのSHAとは違うから。スクワッシュマージされたブランチを検出するための同等のツールって何が一番いいのかな?注意: この問題は見た目よりも安全に対処するのが難しいんだ。例えば、リモートでスクワッシュマージされたfooというブランチがローカルにあったとして、その前にローカルでいくつかコミットを追加してプッシュし忘れたら、単純にローカルのfooを削除するとデータを失うことになっちゃう。

Hacker Newsで議論の続きを見る