使用git filter-repo清理Git历史:分阶段处理提交需求
可以用git filter-repo实现这个需求
核心思路是利用git filter-repo的--commit-callback参数,通过自定义Python脚本区分「大爆炸提交」前后的历史,分别执行不同的过滤规则。
步骤1:定位「大爆炸提交」的哈希值
先找到那次一次性迁移的提交哈希,比如通过日志关键词查找:
git log --oneline | grep "大爆炸" # 替换为你实际的提交描述关键词
假设得到的哈希值是abc123,后续用BIG_BANG_SHA指代这个值。
步骤2:编写过滤回调脚本
创建一个名为filter_script.py的文件,内容如下:
def callback(commit): # 判断当前提交是否在大爆炸提交之前 if commit.id != BIG_BANG_SHA and (not commit.parents or commit.parents[0].id != BIG_BANG_SHA): new_files = [] for file in commit.files: # 仅保留common/shared/foo目录下的文件,同时移除前缀移到根目录 if file.path.startswith("common/shared/foo/"): new_path = file.path[len("common/shared/foo/"):] file.path = new_path new_files.append(file) commit.files = new_files # 过滤后无文件的提交直接跳过,避免空历史残留 if not commit.files: commit.skip()
步骤3:执行git filter-repo命令
运行以下命令,将BIG_BANG_SHA替换为你实际查到的提交哈希:
git filter-repo --commit-callback "exec(open('filter_script.py').read().replace('BIG_BANG_SHA', '$BIG_BANG_SHA'))"
注意事项
- 操作前务必完整备份仓库,因为git filter-repo会重写历史,操作不可逆。
- 「大爆炸提交」及其之后的所有提交会完全保留原样,不会被修改。
- 脚本会自动跳过「大爆炸提交」之前、但未涉及
common/shared/foo目录的空提交。
内容的提问来源于stack exchange,提问作者62mkv
相关产品推荐
相关产品推荐

