如何同步两个远程Git仓库?(How do I synchronise two remote Git

2019-08-17 03:20发布

我有两个库URL,我想它们同步,使得它们都包含同样的事情。 在水银,我想要做的是:

hg pull {repo1}
hg pull {repo2}
hg push -f {repo1}
hg push -f {repo2}

这将导致在这两个回购两个头(我知道这是不常见的有两个头,但我这样做是为synchornisation和它需要非交互式的。该负责人将手动从回购中的一个,再被合并同步再次运行)。

我想这样做同样的事情在Git中。 例如,没有用户交互,让所有的变化到两个回购协议,有多个分支/头/无论稍后合并。 我想在命令做到这一点使用的URL,而不是增加遥控器(?),因为有可能是一些参与回购,并具有所有这些别名只会让我的剧本更加复杂。

我目前使用克隆回购git clone --bar {repo1}但我挣扎,“更新”了。 我试图get fetch {repo1}但似乎并没有拉我下来的变化; git log仍然没有显示已在repo1添加了变更。

我也试过用--mirror在我的pushclone ,但似乎从repo2远程的变更是不存在本地,而我需要不断的改变来自两个回购协议:/

什么是做到这一点的最好方法是什么?

编辑:为了使它更清晰一点什么,我试图做...

我有两个库(例如到位桶和GitHub上),并希望人们能推动或者(最终,一会的Git,一个将是水银,但让我们假设他们都是混帐现在把事情简单化)。 我需要能够运行一个脚本,将“同步”两个的方式,它们都包含了全部的修改,可能需要以后手动合并回购。

最终,这意味着我可以与回购之一(例如,Mercurial的一个)进行交互,而我的脚本将在Git的周期性变化拉,我可以合并的,然后他们会推后。

在这水银是微不足道的 ! 我只是从两个回购拉,并与推-f/--force ,使推多头。 那么任何人都可以克隆回购之一,合并的头,并推回。 我想知道怎么做的最接近类似的事情,在Git中。 它必须是100%的非互动性,必须保留两个回购,该过程可以无限重复的状态(这意味着没有改写历史/变更的变更等)。

Answer 1:

的Git分支没有“头”中的水银感。 只有一种东西叫HEAD ,它有效地是一个符号链接到提交当前已签出。 在托管库就像GitHub上的情况下, 没有提交签出,但只是库历史本身。 (被称为“裸”回购。)

这样做的原因不同的是,Git的分支名称完全是任意的; 他们没有到资源库的副本之间匹配,并且可以创建并摧毁他们在异想天开。[1] Git的分支像Python变量名,可以围绕你喜欢进行改组,并坚持任何价值; 水银分支就像C变量,是指在固定的预分配存储位置,那么您填写数据。

所以,当你在水银拉,你有两个历史记录,并在同一个分支,因为分支名称是在这两个仓库的固定有意义的事情。 每一个历史的叶子是“头”,和你通常将它们合并以创建单个头。

然而在Git中,获取远程分支实际上并不影响您的分行在所有。 如果您获取master从分支origin ,它只是进入一个分支叫origin/master [2]。 git pull origin master只是薄糖两个步骤:获取远程分支到origin/master ,然后合并其他分支到当前的分支。 但他们不必具有相同的名称; 您的分支可以被称为developmenttrunk或任何其他。 你可以拉或任何其他分支合并到它,你可以把它推到其他分支。 Git不会在意。

这使我回到你的问题:你不能把一个“第二”分公司负责人到远程Git仓库,因为这个概念并不存在。 你可以推到与错位的名称(分公司bitbucket_master ?),但据我所知,你不能远程更新远程的遥控器。

我不认为你的计划使得很多的感觉,不过,因为与未合并的分支接触到两个库,你要么必须合并他们两个,或者你会合并一个,然后镜像它在另一个的上面。 ..在这种情况下,你留下的第二个库中无用的状态,没有任何理由。

是否有一个原因,你不能只是这样做:

  1. 选择存储库是规范的,我想到位桶。 克隆它。 它成为origin

  2. 添加其他存储库作为远程调用,比如, github

  3. 有一个简单的脚本定期取两个遥控器,并尝试将合并github分支(ES)为origin的分支。 如果合并失败,中止,并且向您发送电子邮件或什么的。 如果合并是微不足道的,推动的结果这两个遥控器。

当然,如果你只是做你的功能分支的所有工作,这一切就会变的问题。 :)


[1]它会变得更好:您可以一起分行从任何没有历史共同不同的存储库合并。 我做这巩固了separatedly开工项目; 他们用不同的目录结构,所以它工作正常。 GitHub上采用了类似的伎俩其页面功能:你的页面的历史记录存储在一个名为分支gh-pages ,生活在同一个版本库,但有共同的绝对没有历史与项目的其余部分。

[2]这是一种白色谎言。 分支仍叫master ,但它属于远程被叫origin ,和斜线是指它的语法。 这种差别很重要,因为Git有没有关于分支名称斜线疑虑,所以你可以有一个本地分支命名的origin/master ,这将阴影的远程分支。



Answer 2:

类似的东西,我用网络挂接trigerred这个简单的代码在这两个库同步GitLab和到位桶master分支:

git pull origin master
git pull gitlab master
git push origin master
git push gitlab master

这propably是不是你有问题需要的东西,但它可能是为别人谁需要同步只是一个分支很有帮助。



Answer 3:

下面是这一问题的解决方案进行测试: http://www.tikalk.com/devops/sync-remote-repositories/

命令来运行:

#!/bin/bash

# REPO_NAME=<repo>.git
# ORIGIN_URL=git@<host>:<project>/$REPO_NAME
# REPO1_URL=git@<host>:<project>/$REPO_NAME

rm -rf $REPO_NAME
git clone --bare $ORIGIN_URL
cd $REPO_NAME
git remote add --mirror=fetch repo1 $REPO1_URL
git fetch origin --tags ; git fetch repo1 --tags
git push origin --all ; git push origin --tags
git push repo1 --all ; git push repo1 --tags


Answer 4:

尝试git reset --hard HEADgit fetch 。 不过,我不知道我理解你的目标是什么。 您将需要cd到一个独立的存储目录运行取,复位,并推命令之前。



Answer 5:

你可能没有看到的获取实际上做的工作,当你使用git clone --mirror --bare ,因为默认情况下的git不会列出它的远程分支机构。 你可以列出他们git branch -a

我不太有语法制定了无名的遥控器,但你可以根据从URL中一些方案自动添加遥控器......在任何情况下,它可能会最好的,如果你选择每个一些独特的和一致的名称工作回购,这样你就可以知道什么样的变化,从哪里传来

但是,你可以尝试这样的事:

git clone --bare --mirror --origin thing1 {repo1} repo.git
cd repo.git
git fetch thing2 --mirror
git push thing1 --mirror
git push thing2 --mirror

在此之后做,thing1就都可以在任何时间合并thing2的分支机构,远程分支机构。 可以列出与远程分支机构git branch -a

在GitHub上或到位桶,您将无法通过Web界面看到这些远程分支机构,但你能看到他们,如果你用--mirror克隆,所以他们确实存在。



文章来源: How do I synchronise two remote Git repositories?