Geo*_*ins 31 git synchronization repository
我们有两层设置.
我们有一个主存储库(下面称为"主要").
还有一个二级存储库(下面称为"二级"),它是这样创建的:
$ git clone --bare --shared $REPO_A/primary secondary.git
Run Code Online (Sandbox Code Playgroud)
在辅助存储库上工作的人将来自主存储库的分支视为只读,但是将这些分支基于这些分支.
我们希望每天一次将辅助存储库与主存储库同步.
也就是说,我们希望提交到主服务器的提交和新分支对于在辅助存储库中工作的人员是可见的(下次他们执行拉动).
我们不希望这是对称的,即对于在主存储库之外工作的人来说,对辅助存储库的活动不会变得可见.
理想情况下,我想运行一台运行在机器上的cron作业,该辅助存储库以某种方式从主服务器获取新数据并自动将其包含到辅助服务器中.
我希望有一个简单的方法可以做到这一点(我希望有人在这里告诉我有).
如果我要写一个脚本来做它,它会做:
创建辅助的新克隆.
$ git clone $REPO_B/secondary
$ cd secondary
Run Code Online (Sandbox Code Playgroud)获得所有分支机构.
$ git branch -r | sed 's?.*origin/??'
Run Code Online (Sandbox Code Playgroud)获取主要仓库中的所有分支.
$ git ls-remote --heads $REPO_A/primary | sed 's?.*refs/heads/??'
Run Code Online (Sandbox Code Playgroud)对于我尚未拥有相应辅助分支的每个主分支:
$ git fetch $REPO_A/primary $BRANCHNAME:$BRANCHNAME
$ git push origin $BRANCHNAME:refs/heads/$BRANCHNAME
Run Code Online (Sandbox Code Playgroud)对于我已经拥有相应二级分支的每个主分支:
$ git checkout -b $BRANCHNAME --track origin/$BRANCHNAME
$ git pull $REPO_A/primary $BRANCHNAME
$ git push
Run Code Online (Sandbox Code Playgroud)由于我是git的新手,如果我没有考虑某些基本问题,我不会感到惊讶吗?
就像我说的那样,我希望有一种更简单的方法可以做到这一点,即有人说"哦,不要那么做,只做......".
Von*_*onC 31
哦,不要那么做,只是这样做:
git --bare fetch
Run Code Online (Sandbox Code Playgroud)
;)
(例如,请参阅此旧线程)
如果您已将相关的远程原点添加到您的裸仓库中,则可以依次获取每个原点.
Dus*_*tin 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
Run Code Online (Sandbox Code Playgroud)
从那里,我有一个post-commit hook(.git/hooks/post-commit
),如下所示:
#!/bin/sh
curl -sS http://my.home.machine/gitmirror/bak/repo-name.git
Run Code Online (Sandbox Code Playgroud)
你可以通过从接收方推动来完成同样的事情.这具有在正常情况下发射和遗忘有效载荷的优点.