我在 git 中有一个本地项目,其中包含一些数据(例如单元测试的输入)。这些数据在项目过程中发生了变化,并且在某一时刻要大得多。现在,我不需要将项目恢复到那个状态,但是每当我clone
使用 git 执行新的操作时,项目的大小是巨大的(来自所有数据更改)。
有没有办法以某种方式重置我的项目以擦除某些目录(例如项目/数据/)中的历史记录,以便只存储最近的状态?
我在 git 中有一个本地项目,其中包含一些数据(例如单元测试的输入)。这些数据在项目过程中发生了变化,并且在某一时刻要大得多。现在,我不需要将项目恢复到那个状态,但是每当我clone
使用 git 执行新的操作时,项目的大小是巨大的(来自所有数据更改)。
有没有办法以某种方式重置我的项目以擦除某些目录(例如项目/数据/)中的历史记录,以便只存储最近的状态?
要从历史记录中删除一些文件但将它们保留在最近的提交中(例如最近 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 – 缩小存储库的清单。
您可能只想尝试git gc --aggressive
清理未引用的项目。如果在过去两周内进行了大文件更改(默认情况下),这不会消除它们,但经过足够的时间后它应该会消除它们。这会自动发生,但您可以使用git gc
您还可以通过添加更改该两周日期--prune=now
,但这可能不是一个好主意,因为您希望保留大多数文件的历史记录。
如果你的合作者不会完全被淘汰,只是cp
在你处于最下游状态时的某个git filter-branch
目录,你的代码库中的目录并在你自己之后清理,然后cp
它回到 repo 并重新提交。
公平警告:改写历史不能掉以轻心,但如果只是你自己,或者几个知道自己在做什么的合作者,如果它显着改善了你的日常生活,这没什么大不了的。