自动化git以仅保留每个分支的尖端以节省空间

时间:2018-01-09 19:31:09

标签: git diskspace

我有一个脚本可以生成大量的git存储库提交,然后定期推送所有分支。没有必要在该计算机上保留一个大的历史,它会很快占用磁盘空间(而且我的磁盘空间很少)。

我目前正在定期运行

git commit -a (...)
git push --all
git prune
git gc

从长远来看,这不足以使磁盘使用率保持足够低。我正在寻找一个命令来添加到这个脚本中,该命令只保留每个分支的最后几次提交(我只有2个)在这台机器上,然后让git gc回收磁盘空间我

让我澄清一下:我不想重写历史记录,只是为了保持本地存储库.git目录尽可能小,同时保留origin的完整历史记录。令人惊讶的是,我发现的信息非常少。

编辑:这听起来很像浅的存储库(我从未使用过),但从我读到的here来看,浅存储库意味着只有在克隆时跳过部分历史记录,在提交/推送后不要忘记数据。

有一种可能的解决方法,如果没有更好的方法,我将使用它:

# recreate a shallow clone every commit
git commit -a && git push
rm -rf .git/
git clone --depth=1   # shallow clone

2 个答案:

答案 0 :(得分:1)

你可以继续修改上次提交和强制推送。

在你的剧本中:

git commit -a --amend --reuse-message=HEAD
git commit --force push --all

这将保持只有您当前拥有的当前提交数。

要说清楚,这是重写历史,所以它不是团队友好的。

答案 1 :(得分:0)

我最终以cron的身份进行了磁盘空间检查,每当本地存储库超过阈值(200MB)时,便对其进行“重置”。

git commit -a && git push            # just in case
rm -rf .git/
git clone --depth=1 https://....

此解决方案需要git> = 1.9,因为以前的版本不允许从标记为浅的存储库进行推送。 另外请注意,如果您不能100%确定工作目录是否干净,则可能会发生非常糟糕的事情。

这绝不是一个优雅的解决方案,但这就是我最终要解决的问题,因为我无法让git仅维护当前的HEAD并自动忘记其余的HEAD。