自动保持辅助仓库与主仓库同步?

时间:2010-09-08 15:59:49

标签: git synchronization repository

我们有两层设置。

我们有一个主存储库(下面称为“主要”)。

这样创建的辅助存储库(下面称为“辅助存储库”):

$ git clone --bare --shared $REPO_A/primary secondary.git

在辅助存储库中工作的人查看源自主存储库的分支是只读的,但是将这些分支基于这些分支。

我们希望每天一次将辅助存储库与主存储库同步。

即。我们希望提交到主服务器的提交和新分支对于在辅助存储库中工作的人员是可见的(下次他们执行拉动)。

我们不希望这是对称的,即对于在主存储库之外工作的人来说,对辅助存储库的活动不会显示。

理想情况下,我想运行一台运行在机器上的cron作业,该辅助存储库以某种方式从主存储器中提取新数据并自动将其包含在辅助存储库中。

我希望有一种简单的方法可以做到这一点(我希望有人会告诉我有)。

如果我要编写一个脚本来执行此操作,则会执行以下操作:

  • 创建辅助的新克隆。

    $ git clone $REPO_B/secondary
    $ cd secondary
    
  • 获取所有分支。

    $ git branch -r | sed 's?.*origin/??'
    
  • 获取主要仓库中的所有分支。

    $ git ls-remote --heads $REPO_A/primary | sed 's?.*refs/heads/??'
    
  • 对于我尚未拥有相应辅助分支的每个主分支:

    $ git fetch $REPO_A/primary $BRANCHNAME:$BRANCHNAME
    $ git push origin $BRANCHNAME:refs/heads/$BRANCHNAME
    
  • 对于我已经拥有相应二级分支的每个主分支:

    $ git checkout -b $BRANCHNAME --track origin/$BRANCHNAME
    $ git pull $REPO_A/primary $BRANCHNAME
    $ git push
    

由于我是git的新手,如果我没有考虑某些基本问题,我不会感到惊讶吗?

就像我说的那样,我希望有一种更简单的方法可以做到这一点,即有人说“哦,不要那么做,只做......”。

3 个答案:

答案 0 :(得分:29)

哦,不要那样做,只是这样做:

git --bare fetch

(见old thread for instance
如果您已将relevant remote origins添加到您的裸仓库中,则可以依次获取每个来源。

答案 1 :(得分:12)

您可以执行git clone --bare --mirror并定期执行git fetch以实现此目的。

我使用我在node.js中编写的名为gitmirror的工具来实现它,我在家里的机器上运行以接收来自github的webhook以及ad-hoc钩子以同步提交。

对于非github示例,我有一个用于couchdb备份的repo,它每小时提交一次。 cron工作基本上归结为:

# do some backup stuff
git commit -qam "Backup `date`" >> dump.log 2>&1

从那里开始,我有一个提交后挂钩(.git/hooks/post-commit),如下所示:

#!/bin/sh
curl -sS http://my.home.machine/gitmirror/bak/repo-name.git

你可以通过从接收方推送来完成同样的事情。这具有在正常情况下发射和遗忘有效载荷的优点。

答案 2 :(得分:0)

我希望将其视为标准的Git工具。但是这些情况很少见。通常,这意味着您的环境存在一些限制。

我已经针对此问题创建了两个工具,其中一个可以满足我的需求。

但是我必须警告这些工具需要一些知识和经验。
我的文档很差,因为它只能满足我的需要,而且我没有社区可以正确回应。抱歉不要浪费时间,因为您确实必须将时间投入其中。

gitSync-只需安装(很难)并使用。
convention-over-git-您可以从这里捕获想法并编写自己的脚本或工具。

但是,gytSync确实为我解决了这个问题。
我在2017年创建了gitSync。我们一直在使用它,一切都很完美。
是的,我修复了两个错误))

gitSync通过HTTP在任意两个远程git存储库之间同步git分支。
同步分支应遵循命名约定。

我的博客Convention over Git中描述了命名约定。 (在创建gitSync之前,我已经发明了约定。)

您的团队甚至可以在同一个同步的Git分支上工作。没问题。
这是因为gitSync具有自动解决冲突的功能。
请查看Git-conflicts solving中的详细信息,因为如果发生冲突,您可能必须重新提交更改。
实际上,我将不同的电子邮件通知连接到gitSync,因为它将不同的运行状态导出到文件中。

由于可以自动解决冲突,因此任何人都可以在任何同步分支上的两个远程存储库中进行Git合并,并且它将被同步。
这意味着,如果您的团队中只有一个能够进行Git合并或冲突解决,那么他们将成功地对任何存储库中的两个存储库进行此操作。

gitSync甚至可以防止Git存储库偶尔擦拭。

gitSync工具可以抵御网络,IO和操作系统的故障。凭借Git本身以及我在gitSync中实现的一些想法。我什至在创建gitSync之前就将其放入架构中。持续使用证明了这一点。

我通过不同的插件,PowerShell计划作业,自动化服务(Jenkins等)并手动运行gitSymc。