备份git存储库中的所有分支,保留已重定基础和强制执行的分支

备份git存储库中的所有分支,保留已重定基础和强制执行的分支,git,backup,Git,Backup,我正在寻找一个备份多个共享git存储库的解决方案,每个存储库都有多个分支,其中一些分支被重新设置并强制执行(我知道这不符合最佳实践,但这是我现在必须处理的事情) 我在想,一个简单的git克隆--mirror,然后定期git远程更新就足够了,但这不会让任何东西通过强制重新基址 我尝试了git bundle,但我认为这不是一个很好的解决方案 我正在寻找一种增量的、轻量级的、易于使用的恢复工具,我想也许可以使用git格式的补丁为任何地方发生的每一次新提交编写脚本。这对任务来说是不是太多了?我认为克隆镜

我正在寻找一个备份多个共享git存储库的解决方案,每个存储库都有多个分支,其中一些分支被重新设置并强制执行(我知道这不符合最佳实践,但这是我现在必须处理的事情)

我在想,一个简单的
git克隆--mirror
,然后定期
git远程更新
就足够了,但这不会让任何东西通过强制重新基址

我尝试了
git bundle
,但我认为这不是一个很好的解决方案

我正在寻找一种增量的、轻量级的、易于使用的恢复工具,我想也许可以使用
git格式的补丁
为任何地方发生的每一次新提交编写脚本。这对任务来说是不是太多了?

我认为
克隆镜像方法值得回顾一下。如果你想恢复一个被强制推过的分支的过去位置,只需看一下回流图。为了绝对确定这一点,您可以将
gc.prueexpire
设置为
never
,并将
gc.reflogExpireUnreachable
设置为相同,以便永远不会删除reflogs和无法访问的对象。那应该包括你。重要提示:默认情况下,在裸存储库中禁用重登录。您可以通过设置
core.logAllRefUpdates
来启用它们

请注意,push-to存储库中的reflogs将包含发生的任何强制推送的记录。如果您想更加确定这一点,您甚至可以编写一个更新钩子来检测传入的强制更新,并将它们记录在特殊的地方,可能是通过创建一个ref,比如
refs/backups/mybranch-{n}


事实上,一些分支经常被重定基址并没有什么错,只要它是以一种定义明确的方式进行的,这样就不会让任何人措手不及。git.git中的
pu
分支就是一个很好的例子。

因此,如果我克隆镜像一个repo,然后开发人员在其中重新设置分支并删除commit x,然后远程更新镜像repo,我应该在reflog中仍然有commit x?我试过了,但没有效果described@Samer:哦,我忘了,您必须在裸存储库中手动启用重登录。配置参数为
core.logAllRefUpdates