使用git保持私有存储库同步的方法

时间:2015-07-21 01:22:36

标签: git

我们有一个跨越两个物理位置的开发环境。

我们正处于尝试合并迄今为止的软件开发工作的最初阶段。很多重复等...

一个位置驱动开发,而另一个位置真正加速。一个主要问题是,主要开发团队在非常古老的服务器上,并没有使用更新的GitHub样式编码方法;我们希望采用Pull请求和代码审查,因为它们对我们向客户发布的方式具有优势。

这是设置。

位置A使用Gitolite并拥有“主”存储库

位置B使用GitLab,因为我们希望采用Pull-Requests,管理用户可以通过Web界面完成,这会减轻我的管理负担(我们很小)。我们喜欢的其他功能。

我试图做的事情,我认为很简单,就是在位置B设置一个cron作业,它只是从位置A拉出,然后在夜晚(相反的时区)推送到位置B.

它被证明是一种PITA。我似乎无法找到一种方法来轻松获取所有远程分支,而不是以某种手动方式检查它们。这导致分支从未被推送到位置B.

我错过了一些明显的东西吗?这只是我想要做的愚蠢吗?最终目标是我们使用运行GitLab的1台服务器获得位置A和B,但这可能需要一段时间,而且有些人会说服他们。

SSH访问完全可以解决并且与cron作业一样有效。这真的是我不能让我做我想做的事情。我可以进行一次获取 - 但是它也可以从位置B远程抓取...而不是我想要的。

以下是尝试从一个来源获取所有远程分支的脚本的开始,但它有各种各样的问题:

remote=locationA ; 
for brname in `
  git branch -r | grep $remote | grep -v master | grep -v HEAD 
  | awk '{gsub(/[^\/]+\//,"",$1); print $1}'
`; do 
  git branch --set-upstream-to $brname $brname; 
  # or
  git branch --track $brname  $brname ; 
done

我会继续解决这个问题。只是想我会发布在这里,以确保我没有遗漏一些明显的东西或走下一条荒谬的道路。

1 个答案:

答案 0 :(得分:0)

我能够完成使用git-python的求助。

我写了一个脚本来迭代任何给定存储库的遥控器。如果遥控器是原产地' (位置A)然后脚本获取所有分支和标签。然后脚本将所有内容推送到' secondary' (位置B)回购。

我可以使用fcron运行这个脚本,所以我基本上最终得到了一个不断更新的#34;镜像"存储库。

同样,不确定这是否只是我遇到的某种疯狂问题,或者是否有更简单的方法。但这很有用。

脚本供参考,但不是100%完成,所以请明智地使用。

""" gitSync.py

此脚本的目的是在两者之间自动执行gitSync 库。这将从一个遥控器中提取所有分支和标签 然后把它们推到另一个。

"""
import git
from git import Repo
import os


def main():

    join = os.path.join
    repo = Repo(os.getcwd())
    git = repo.git
    assert not repo.bare

    for remote in repo.remotes:
        print remote
        if str(remote) == 'origin':
            for ref in remote.refs:
                print " " + str(ref)
                try:
                    git.checkout(str(ref), '-t')
                except:
                    print "Could not check-out branch. It probably already exists"
            git.fetch(str(remote))
            git.fetch('-t', str(remote))
            git.pull
            git.push('secondary', '--all')
            git.push('secondary', '--tags')


#-------------------------------
if __name__ == "__main__":
    main()