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

如何移除Git仓库历史提交记录,仅保留每个文件最后一次提交日志?

如何移除Git仓库中文件的旧提交,仅保留每个文件的最后一次提交

嘿,要实现这个需求,本质是重写Git历史来清理掉每个文件的旧提交,只保留它们的最后一次修改记录。不过先敲个警钟:这种操作会彻底改变仓库的提交哈希,如果你的仓库已经推送到远程,所有协作的开发者都需要同步更新,而且一旦操作失误很难恢复,所以第一步必须备份仓库!


1. 先备份你的仓库

别嫌麻烦,这步能救你一命:

# 方式1:克隆一个镜像备份
git clone --mirror ./ your-repo-backup.git

# 方式2:直接复制整个仓库文件夹到其他位置
cp -r your-repo/ your-repo-backup/

2. 安装git filter-repo(推荐工具)

Git官方早就不推荐用git filter-branch了,git filter-repo是它的替代方案,更高效、更稳定。如果你的Git版本在2.22.0以上,可能已经内置了;如果没有,按你的系统安装:

  • Ubuntu/Debian:sudo apt install git-filter-repo
  • macOS:brew install git-filter-repo
  • Windows:下载git-filter-repo脚本放到Git的bin目录即可

3. 生成每个文件的最后提交列表

我们需要先找出每个文件对应的最新提交哈希。运行这条命令,它会从旧到新遍历所有提交,记录每个文件最后一次被修改的提交:

git log --reverse --pretty=format:"%H %f" | awk '{files[$2] = $1} END {for (f in files) print files[f], f}' > keep_commits.txt

执行后,keep_commits.txt里的内容就和你预期的一样:

df5bf4b a.file
4e818fa b.file

4. 筛选需要保留的提交哈希

从上面的文件里提取出所有要保留的提交哈希:

awk '{print $1}' keep_commits.txt > commit_hashes.txt

5. 重写Git历史,只保留目标提交

用git filter-repo的回调脚本,只保留我们需要的提交:

git filter-repo --commit-callback '
import sys
keep_hashes = set(line.strip() for line in open("commit_hashes.txt"))
if commit.hexsha not in keep_hashes:
    skip()
'

这个脚本会遍历所有提交,只保留在commit_hashes.txt里的那些提交,其他的直接跳过。

6. 验证结果

运行这条命令检查最终的提交日志:

git log --pretty=format:"%H %f"

你应该会看到每个文件只显示最后一次提交,和你想要的结果完全一致。

7. 清理仓库体积(可选)

重写历史后,仓库里会留下一些未被引用的对象,运行以下命令彻底清理,进一步减小体积:

git reflog expire --expire=now --all
git gc --prune=now --aggressive

8. 同步远程仓库(如果已推送)

如果你的仓库之前推送到了远程,需要强制推送重写后的历史(注意:这会覆盖远程的历史,一定要确保所有协作方都知情):

git push --force origin main  # 把main换成你的分支名,比如master

其他开发者需要重新克隆仓库,或者执行以下命令同步:

git fetch origin
git reset --hard origin/main

内容的提问来源于stack exchange,提问作者bluelovers

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.28 07:17:48