前言
最近看到好几个有意思的repo, 不过各自的产品想法上都有延伸, 于是手痒自己也从基础版开始尝试改造.
等到后面逐渐成型了, 发现 git init 的位置选在了根目录, 其它的参考 repo 也都在下面.
如何将自己的项目文件夹剥离出来呢? 这就要用到本文的主角了 git filter-repo
简介
git filter-repo 是一个用于重写 Git 仓库历史的现代化工具,它是 git filter-branch 的替代品,具有以下特点:
主要功能:
- 删除敏感数据: 从整个 Git 历史中移除密码、密钥等敏感信息
- 清理大文件: 删除历史中的大文件以减小仓库体积
- 重写提交历史: 修改作者信息、邮箱、提交信息等
- 目录重组: 提取子目录、合并仓库、重命名路径
- 过滤文件: 按文件名、路径、大小等条件过滤历史记录
核心优势:
- 性能优异 : 比
git filter-branch快 10-100 倍 - 使用简单: 命令行接口更直观易用
- 功能强大: 支持 Python 脚本进行复杂的自定义过滤
- 安全可靠: 内置多种安全检查,避免数据丢失
典型使用场景:
bash
# 删除某个文件的所有历史记录
git filter-repo --path 文件名 --invert-paths
# 删除大于指定大小的文件
git filter-repo --strip-blobs-bigger-than 10M
# 提取某个子目录作为新仓库
git filter-repo --path 子目录/ --path-rename 子目录/:
注意事项:
- 会重写整个 Git 历史,所有 commit SHA 都会改变
- 使用前建议备份仓库
- 操作后需要强制推送 (
git push --force)
实战
安装
建议直接参考 官方安装手册
使用
bash
步骤 1:备份原仓库
# 创建完整备份
cd /Users/THIS/IS/YOUR/ORI/REPO/PATH
cp -r SeanProj SeanProj.backup
步骤 2:克隆仓库用于提取
# 创建独立副本
cd /Users/THIS/IS/YOUR/ORI/REPO/PATH
git clone SeanProj SeanProj-standalone
cd SeanProj-standalone
步骤 3:执行提取操作
# 保留 所需目录,并移到根目录
git filter-repo --path Target-dir/ --path-rename Target-dir/: --force
命令说明:
- --path Target-dir/:只保留 Target-dir/ 目录的文件
- --path-rename Target-dir/::将 Target-dir/ 移到仓库根目录
- --force:强制执行(因为是 clone 的仓库)
步骤 4:验证结果
# 检查分支,看下是不是跟原来一样
git branch -a
# 检查标签
git tag
# 检查提交数
git log --all --oneline | wc -l
# 检查文件结构(应该在根目录)
ls -la
# 检查仓库大小
du -sh .git
🎉 完成
至此, 你应该就成功的把之前冗余的项目成功剥离出自己需要的部分~