备份git仓库中的所有分支,包括已经rebase和force过的分支

3
我正在寻找一种备份多个共享git仓库的解决方案,每个仓库有多个分支,其中一些分支会使用rebase和force(我知道这违反了最佳实践,但这是我现在必须处理的事情)。
我想过一个简单的"git clone --mirror",然后定期运行"git remote update"应该就足够了,但如果有分支使用push force,那就无法保留。
我尝试使用"git bundle",但我不认为它适合我现在要做的事情。
寻找一些增量、轻便且易于恢复的东西,我正在考虑也许可以使用"git format-patch"来编写脚本,记录发生在任何地方的每一个新提交。对于这个任务来说,这是否过于繁琐了?
1个回答

7
我认为值得回顾clone --mirror方法。如果您想恢复被强制推送的分支的过去状态,只需查看引用日志即可。为了绝对确定这一点,您可以将gc.pruneExpire设置为never,同样,将gc.reflogExpireUnreachable也设置为never,以便引用日志和不可达对象永远不会被删除。那应该可以保护您。重要提示:裸仓库默认禁用引用日志。您可以通过设置core.logAllRefUpdates来启用它们。
请注意,被推送到的仓库中的引用日志将包含任何发生的强制推送记录。如果您想更加确信这一点,您甚至可以编写一个更新钩子来检测传入的强制更新并将它们记录在某个特殊位置,例如创建一个引用,类似于refs/backups/mybranch-{n}
而且,一些分支经常被重新设置是没有问题的,只要以明确定义方式执行,这样就不会有人感到措手不及。git.git中的pu分支就是一个完美的例子。

如果我克隆了一个仓库并使用--mirror选项,然后开发人员在其中的一个分支上进行了变基并删除了提交x,然后我远程更新了镜像仓库,那么我是否应该在reflog中仍然有提交x?我尝试过,但它并没有按照描述的方式工作。 - Samer Buna
1
@Samer:糟糕,我忘记了,在裸仓库中需要手动启用reflogs。配置参数是core.logAllRefUpdates - Cascabel

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接