自动化 git 只保留每个分支的尖端以保存 space

Automate git to keep only the tip of each branch to save space

我有一个脚本生成大量提交到 git 存储库,然后定期推送所有分支。没有必要在那台机器上保留一个很大的历史记录,它很快就会吃掉磁盘space(我的磁盘space很稀缺)。

我目前运行定期

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

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

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

编辑:这听起来很像一个浅存储库(我从未使用过),但从我读到的内容来看here, 浅存储库意味着在克隆时只跳过部分历史记录,不会忘记 commit/push 之后的数据。

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

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

您可以继续修改最后一次提交并强制推送。

在您的脚本中:

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

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

但需要明确的是,这是在重写历史,因此对团队不友好。

我最终将磁盘 space 检查作为一项 cron 工作,每当本地存储库超过阈值 (200MB) 时,就会 "reset" 它。

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

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

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