有没有一种快捷方法,可以删除某个目录中所有早于一年前的改动?

编程语言 2026-07-09

我有一个个人的git仓库,在公司提供的另一套源代码管理系统之上使用,用来在git中重放公司系统中的提交(也反向进行)。这运行得挺好;然而.git目录太大,git filter-repo的分析显示,大约90% 的空间被某个目录中的大型二进制文件的历史记录占据。我对该目录在一年前的历史并不感兴趣,想简单地把自那时起的所有历史从main分支以及我加入以来创建的分支中移除。(如果有远程仓库可用,我会对这些二进制文件直接使用LFS,这样问题就会消失。)

我过去使用git filter-repo来重写历史,但没看到有办法把它用来在某个日期之前移除一个目录的历史。我当然可以按如下思路来做:在一个新的克隆中,检出一年前的main;使用git filter-repo删除该目录中的二进制文件;在那时的状态下创建一个新的提交;然后从那时起把main上的所有后续提交——以及我想保留的其他分支上的提交——逐个挑选过去。这个做法是完全可行的,但我希望用git filter-repo会有更简单的办法。我也愿意尝试其他方法。

解决方案

你可以使用 --commit-callback 标志来查看每个提交的日期。如果提交早于一年前,脚本会从该提交的文件列表中移除该目录。

在你仓库的新克隆中运行以下命令:

git filter-repo --commit-callback '
import datetime

# Calculate the cutoff date (1 year ago)
cutoff = datetime.datetime.now(datetime.timezone.utc) - datetime.timedelta(days=365)
commit_date = datetime.datetime.fromtimestamp(commit.author_date, datetime.timezone.utc)

# If the commit is older than the cutoff, purge the binary directory
if commit_date < cutoff:
    # Replace "path/to/binaries/" with your actual directory path
    # The trailing slash ensures we match the directory content
    prefix = b"path/to/binaries/"
    commit.file_changes = [f for f in commit.file_changes if not f.filename.startswith(prefix)]
'
站内所有文章版权归属LeftHeroAI导航站,无授权禁止任何主体转载、抄袭、复制内容,亦不得私自架设镜像站点。一经侵权,本站将通过法律途径追责。

相关文章