2010-09-08 107 views
26

我们有两层设置。自动保持辅助回购与主回购同步?

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

和二级库(称为“次要”下方),这是像这样创建:

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

人们对二级库工作查看这源于主库为只读的子公司,但根据他们自己的从这些分支分支。

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

I.e.我们希望提交到主要的提交和新分支对于在辅助存储库中工作的人员可见(下次他们进行提取时)。

我们不希望这是对称的,即针对辅助存储库的活动对于那些在主要存储库中工作的人不会看到。

理想情况下,我想运行一个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的新手,我不会感到惊讶,如果我失败了t o考虑某些基本问题?

而且就像我说过的,我希望有一个更简单的方法来做到这一点,即有人会“哦,不要这么做,只是做......”。

回答

25

哦,别做这一切,只是做:

git --bare fetch 

;)

(见本old thread for instance
如果您已经添加了relevant remote origins到裸露的回购协议,你可以取依次是这些起源中的每一个。

+4

这看起来像我想要的。谢谢链接 - 从这些我得到: '$ cd secondary.git ; git --bare fetch origin'+ refs/heads/*:refs/heads/*'' 作为一名资深的UNIX黑客,我总是非常想明白我在做什么,但是大部分的Git文档似乎都是为了真正的简单的爱丽丝和鲍勃的案例,以及任何更复杂的东西都呈现在食谱风格上。你能为Git推荐一本好的深度书籍或Web文档吗? – 2010-09-09 10:31:12

+4

@George:是:http://www.newartisans.com/2008/04/ GIT-从第e-bottom-up.html,虽然http://stackoverflow.com/questions/315911/git-for-beginners-the-definitive-practical-guide提供了许多其他有趣的链接。 http://tom.preston-werner.com/2009/05/19/the-git-parable.html也不错。 – VonC 2010-09-09 11:32:40

+0

还要注意那些ref规范是在你的git配置中的,所以'fetch = + refs/*:refs/*',你只需要键入'git fetch' – Dustin 2010-09-09 16:53:40

10

您可以只做一个git clone --bare --mirror并定期做一个git fetch来实现此目的。

我使用一个名为gitmirror的工具来实现它,我在节点中写道。js我在家里的一台机器上运行以接收来自github的webhooks以及ad-hoc挂钩来同步提交。

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

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

从那里,我有一个post-commit钩子(.git/hooks/post-commit),看起来像这样:

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

您可以通过按下完成同样的事情接收方。这具有在正常情况下发射并忘记有效载荷的优点。

+0

编辑:自从VonC提醒我以后,向克隆系添加了“--bare”。通常我会这样做,并意识到我没有'--bare',然后手动转换或再次执行。 – Dustin 2010-09-08 17:41:12

+0

有趣的备份选项(和比我更详细的答案)。 +1 – VonC 2010-09-09 03:52:06

+1

VonC的建议似乎是做我想做的。然而我感觉很糟糕 - 因为我没有真正给予Dustin的建议一个机会,因为我找不到任何解释--mirror选项的方式。 例如git-clone手册页只是说“设置远程存储库的镜像,这意味着--bare。” 但这是什么意思生命周期明智等?如何使用--mirror克隆与不是不同的版本库?令人惊讶的是,Google-ing没有给我启发:( – 2010-09-09 10:10:13