从Git存储库中删除大量开销

时间:2012-07-23 18:52:53

标签: git git-filter-branch

我在git中有一个本地项目,它包含一些数据(例如输入用于单元测试)。这个数据在整个项目过程中发生了变化,并且在某一点上要大得多。现在,我没有必要将项目恢复到该状态,但每当我使用git执行一个新的clone时,项目的大小是巨大的(来自所有数据更改)。

有没有办法以某种方式重置我的项目以清除某些目录中的历史记录(例如项目/数据/),以便只存储最新的状态?

3 个答案:

答案 0 :(得分:1)

要从历史记录中删除某些文件但将其保留在最近的提交中(例如最近6个月),您可以使用git filter-branch,如下所示:

cutoff=`date -d '6 months ago' +'%s'`
remove="git rm --cached --ignore-unmatch 'project/data/*.zip'"
git filter-branch --tag-name-filter cat --index-filter \
  "[ `git log -1 --format=%at \$GIT_COMMIT` -lt $cutoff ] && $remove || true" \
  -- --all

要删除此后剩余的任何剩菜,请参阅git filter-branch ­­– Checklist for Shrinking a Repository

答案 1 :(得分:0)

您可能只想尝试git gc --aggressive来清理未引用的项目。如果大文件在过去两周内发生了变化(默认情况下),这将不会消除它们,但是经过足够的时间后它应该会消失。这会自动发生,但您可以使用git gc

强制执行此操作

您还可以通过添加--prune=now来更改为期两周的日期,但可能不是一个好主意,因为您希望保留大多数文件的历史记录。< / p>

答案 2 :(得分:0)

如果您的合作者不会完全被淘汰,只需cp当您处于最下游状态时的某个位置,git filter-branch the directory out of your codebase and cleanup after yourself,然后cp它回到回购并且重新提交。

公平警告:重写历史不是轻描淡写,但如果仅仅是你,或者是一些知道他们正在做什么的合作者,如果它能显着改善你的日常工作,那就不是什么大不了的事了。日常生活。