【问题标题】:Git backups: can I copy a git bare repository while it's being pushed to?Git 备份:我可以在推送到 git 裸存储库时复制它吗?
【发布时间】:2012-06-22 10:10:50
【问题描述】:

在我们公司,我们正在尝试从 svn 迁移到 git。我们想让这对团队来说变得简单,同时不会给系统管理员带来太多负担。

我们找到了一种方法来做到这一点,方法是在每个团队拥有的 (Windows) 网络驱动器上创建一个裸存储库,然后向/从该驱动器推送/拉取。身份验证是通过文件访问权限安排的,因此无需设置 https 和整个身份验证内容。伟大的! (而且我们可以通过 VPN 远程访问驱动器,所以它几乎和 https 或 git+ssh 解决方案一样好)

更好的是,我们甚至可以免费获得备份,因为网络共享已经在备份。但是,此备份的运行相当不可预测(备份会持续几个小时,因此可能会持续到下一个工作日)。

因此,驱动器可能正在备份,而开发人员正在推送到存储库。使用 SVN,这可能会导致问题,这就是 svn hotcopy 存在的原因。

git 是否存在同样的风险?当有人推送到某个地方时,我可以在某个地方复制一个裸存储库吗?当然,推入完成后无法恢复也没关系。如果必须做一些工作来恢复在被推送到时创建的备份(即通过删除半完成的推送残留数据),这也很好。但是,如果整个裸存储库损坏且无法使用,那就是个问题。

我做了一些实验,没有发现问题,但这并不意味着不可能有任何问题。

编辑:我接受了“以正确的方式做”的答案,因为从长远来看,这是我打算做的。然而,就目前而言,对我们而言,一个简单的解决方案是在自动备份开始前大约一个小时 将整个裸存储库(在同一个驱动器上)git clone。自动备份可能会错误地复制“真实”存储库,如果它在那个时候已经被使用,但它不会对最近克隆的副本有问题。我们知道备份何时开始,而不是何时结束,所以这对我们来说已经足够了。

【问题讨论】:

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

标签: git


【解决方案1】:

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

bundle 命令会将通常使用 git push 命令通过网络推送的所有内容打包成一个二进制文件,您可以通过电子邮件或sneakernet 到处查看该文件,然后将其解包到另一个存储库中。

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

对本地 repo 的快速测试表明,以下内容会创建一个文件,其中包含在完整 repo 备份中通常需要的所有内容:

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

从捆绑文件创建一个克隆很简单:

$ git clone my.bundle my-repo

使用git ls-remote my.bundle表示所有标签和分支都在bundle中。

但是,要备份可能不在捆绑文件中的内容(如配置、挂钩、移植、替代等),我会进一步备份几个步骤并备份 Git repository(简称 @987654330 @、refslogs 目录)和包文件(objectsrefs 存储库目录的内容在包中,不需要)。除非捆绑包确实包含这些文件;那么你只需要备份捆绑包。

【讨论】:

    【解决方案2】:

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

    如果您已经处理过这种情况,则可以在此处使用相同的方法。否则你可能会在任何地方得到损坏的文件,无论是在 git 中,还是在 svn 中,甚至在裸 TXT 中。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2011-04-29
      • 2010-10-06
      • 2011-01-10
      • 2020-02-22
      • 1970-01-01
      • 2014-03-15
      • 2015-11-05
      • 1970-01-01
      相关资源
      最近更新 更多