Loading... # CIA 泄露文档中的 Git 分支清理单行命令 # 一、概述 ## 1. 简介 ### A. 来源 2017 年,WikiLeaks 发布了 Vault7,这是 CIA 黑客工具和内部文档的大型集合。在这些漏洞利用工具和监控工具中,隐藏着一份非常普通的东西:一页包含 Git 技巧和诀窍的内部开发者文档。 ### B. 核心内容 这份 CIA 开发团队的文档中包含一个实用的 Git 分支清理单行命令,可以快速删除已合并的本地分支。 ### C. 实用价值 这个命令可以定期清理本地仓库中已合并但未删除的分支,保持分支列表的整洁。 ## 2. 前置知识 ### A. 必备技能 - Git 基本操作 - 命令行基础 - 管道和重定向概念 ### B. 推荐知识 - Git 分支管理流程 - Shell 命令组合 # 二、问题背景 ## 1. 问题现象 随着时间推移,本地 Git 仓库会积累大量已合并但未删除的分支。每个功能分支、热修复分支和实验分支在合并后都保留在那里。 ## 2. 查看已合并分支 ```bash git branch --merged ``` 这个命令会列出所有已合并到当前分支的本地分支。 ## 3. 痛点分析 - 手动逐个删除分支非常繁琐 - 分支列表变得冗长,难以找到活动分支 - 容易误删除重要分支 # 三、CIA 原版命令 ## 1. 命令内容 ```bash git branch --merged | grep -v "\*\|master" | xargs -n 1 git branch -d ``` ## 2. 命令解析 ```mermaid graph LR A[git branch --merged] -->|列出已合并分支| B[grep -v 过滤] B -->|排除当前分支和master| C[xargs -n 1 执行] C -->|逐个安全删除| D[git branch -d] ```  ## 3. 各部分说明 ### A. git branch --merged 列出所有已合并到当前分支的本地分支。 ### B. grep -v "\*\|master" - 过滤掉当前分支(用 * 标记) - 过滤掉 master 分支 - 防止删除这些重要分支 ### C. xargs -n 1 git branch -d - 对每个剩余的分支执行删除操作 - 使用小写 -d 参数,安全删除 - 如果分支未合并,删除操作会失败并提示 # 四、更新版本命令 ## 1. 更新原因 大多数现代项目已从 master 分支迁移到 main 分支。需要更新命令以适应新的命名规范。 ## 2. 更新后的命令 ```bash git branch --merged origin/main | grep -vE "^\s*(\*|main|develop)" | xargs -n 1 git branch -d ``` ## 3. 改进说明 - 与远程 main 分支比较,而不是本地当前分支 - 使用扩展正则表达式 -vE - 排除 main 和 develop 等常用分支 - 支持排除其他长期分支 ## 4. 执行时机 建议在部署完成后,从 main 分支执行此命令。 # 五、配置为 Git 别名 ## 1. 创建别名 将以下内容添加到 ~/.gitconfig 文件中: ```bash [alias] ciaclean = "!f() { git branch --merged origin/main | grep -vE \"^\\s*(\\*|main|develop)\" | xargs -n 1 git branch -d; }; f" ``` ## 2. 使用方式 ```bash git ciaclean ``` ## 3. Shell 别名方式 如果更喜欢 Shell 别名,添加到 ~/.zshrc 或 ~/.bashrc: ```bash alias ciaclean='git branch --merged origin/main | grep -vE "^\s*(\*|main|develop)" | xargs -n 1 git branch -d' ``` ## 4. 执行效果 执行后,分支列表从 40 个条目缩减到少数几个。 ```mermaid graph TD A[执行前: 40 个分支] --> B[执行 git ciaclean] B --> C[删除已合并分支] C --> D[执行后: 少量活动分支] ```  # 六、安全注意事项 ## 1. 安全删除机制 - 使用小写 -d 参数而不是大写 -D - -d 参数会检查分支是否已合并 - 未合并的分支删除会失败,保护数据 ## 2. 强制删除警告 如果需要强制删除未合并分支,使用: ```bash git branch -D branchname ``` 但要非常谨慎,未合并的分支可能包含重要代码。 ## 3. 排除规则 确保命令正确排除了: - 当前分支(用 * 标记) - main/master 主分支 - develop 开发分支 - 其他长期维护的分支 # 七、最佳实践 ## 1. 定期清理 建议在以下时机执行清理: - 每次部署完成后 - 每周定期维护 - 合并大量 PR 后 ## 2. 团队协作 - 将此命令分享给团队成员 - 统一使用相同的别名 - 在开发文档中记录 ## 3. 自动化考虑 可以将其集成到 CI/CD 流程中,或设置为 Git Hook。 # 八、命令对比 ## 1. 原版 vs 更新版 | 特性 | CIA 原版 | 更新版 | |------|---------|--------| | 基准分支 | 当前分支 | origin/main | | 排除分支 | master | main, develop | | 正则表达式 | 基础 | 扩展 | | 适用场景 | 老项目 | 新项目 | ## 2. 使用建议 - 老项目仍使用 master:用原版 - 新项目使用 main:用更新版 - 自定义分支名:修改排除规则 *** ## 参考资料 1. [Cleaning up merged git branches: a one-liner from the CIA's leaked dev docs | Spencer Dixon](https://spencer.wtf/2026/02/20/cleaning-up-merged-git-branches-a-one-liner-from-the-cias-leaked-dev-docs.html) 2. [WikiLeaks Vault7 - CIA Git Documentation](https://wikileaks.org/ciav7p1/cms/page_1179773.html) 最后修改:2026 年 02 月 21 日 © 允许规范转载 赞 如果觉得我的文章对你有用,请随意赞赏