You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

使用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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.17 10:20:43