Git备份:当Git裸仓库正在推送时,我能复制它吗?

7
在我们公司,我们正在尝试从svn转向git。我们希望为团队简化这个过程,同时不会给系统管理员带来太多负担。
我们找到了一种方法,通过在每个团队都有的(Windows)网络驱动器上创建一个裸仓库,并推送/拉取到/从那里进行操作。身份验证是通过文件访问权限安排的,因此无需设置https和整个auth内容。太棒了!(我们可以通过VPN远程访问驱动器,因此它实际上几乎与https或git+ssh解决方案一样好)
更好的是,我们甚至可以免费获得备份,因为网络共享已经被备份。但是,这个备份运行相当不可预测(备份持续时间长达数小时,因此可能会延续到下一个工作日)。
因此,可能会在开发人员推送到仓库时备份驱动器。对于SVN,这可能会导致问题,这就是为什么存在“svn hotcopy”的原因。
Git是否存在相同的风险?我可以在某个人正在推送到它的同时将裸仓库复制到其他地方吗?自然而然地,如果正在进行的推送无法恢复,则一切都没问题。如果必须完成一些工作才能还原备份(即通过删除半完成的推送残留数据),那也没问题。但是,如果整个裸仓库变得损坏且无法使用,则存在问题。
我做了一些实验,没有看到任何问题,但这并不意味着没有任何问题。
编辑:我接受了一个“正确的方法”答案,因为这就是我打算长期做的事情。但是,对于我们来说,一个简单的解决方案是在自动备份开始前大约一个小时完全克隆裸仓库(到同一驱动器)。如果在那时它一直在使用,“真正”的存储库可能会被错误地复制,但它不会有问题最近克隆的副本。我们知道备份何时开始,只是不知道何时结束,所以对我们来说足够好了。

2
如果您使用原始复制,可能会有一些分支被锁定(理论上)。您应该优先选择“git clone --bare”。我不确定如果“git clone --bare”遇到锁定的引用时会如何行为(是否等待解锁、失败、忽略锁定或跳过分支——只有前两个选项是安全的)。 - Dmitry Pavlenko
我意识到git clone的某些变体可能是最好的选择。关键是,标准的文件复制备份机制(针对整个驱动器,而不仅仅是git存储库)已经存在。我的问题是,那个备份机制是否足够安全。 - skrebbel
2个回答

2

可能值得更改您的备份策略,不再备份整个Git仓库,而是备份Git bundle。 来自Git's Little Bundle of Joy

该“ bundle”命令将打包一切通常通过git push命令推送到远端的内容到一个二进制文件中,你可以通过电子邮件或sneakernet方式发送它,然后解包到另一个存储库中。

这种方法也在Backup of github repoBackup a Local Git Repository中讨论过。

对本地仓库进行快速测试发现以下代码创建了一个包含完整仓库备份所需内容的单个文件:

$ git bundle create ../my.bundle --all

从捆绑文件创建克隆只需执行以下步骤:
$ git clone my.bundle my-repo

使用git ls-remote my.bundle命令可以显示出所有标签和分支都在捆绑文件中。
然而,为了备份那些可能不在捆绑文件中的东西(如配置、钩子、移植、替代等),我会进一步备份Git仓库(除了objectsrefslogs目录)和捆绑文件(objectsrefs存储库目录的内容已经在捆绑文件中,无需备份)。除非捆绑文件包含这些文件;否则你只需要备份捆绑文件。

0

在备份过程中如何处理可能被修改的其他文件?

如果您已经处理过这种情况,可以在此处使用相同的方法。否则,无论是在 git、svn 还是裸文本中,都可能出现损坏的文件。


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