Dan*_*eny 18 git version-control dvcs github
我有两个存储库URL,我想要同步它们,使它们都包含相同的东西.在Mercurial,我想做的是:
hg pull {repo1}
hg pull {repo2}
hg push -f {repo1}
hg push -f {repo2}
Run Code Online (Sandbox Code Playgroud)
这将导致两个回购中的两个头(我知道有两个头是不常见的,但我这样做是为了同步并且它需要是非交互式的.头部将从一个回购手动合并然后同步再次运行).
我想在Git中做同样的事情.例如,在没有用户交互的情况下,将所有更改都记录到两个repos中,具有多个分支/头/稍后要合并的任何内容.我试图在命令中使用url来做这个,而不是添加remotes(?),因为可能涉及到一些repos,并且为它们设置别名将使我的脚本更复杂.
我正在克隆使用回购,git clone --bar {repo1}但我正在努力"更新"它.我试过了,get fetch {repo1}但似乎并没有把我的改变拉下来; git log仍然没有显示已在repo1中添加的变更集.
我也试过用--mirror在我push和clone,但似乎从repo2远程的变更是不存在本地,而我需要不断的改变来自两个回购协议:/
最好的方法是什么?
编辑:为了让我更清楚一点,我正在尝试做什么......
我有两个存储库(例如BitBucket和GitHub)并希望人们能够推送到任何一个(最终,一个将是Git,一个将是Mercurial,但我们假设他们现在都是Git以简化事情).我需要能够运行一个脚本,它将以两个包含两组更改的方式"同步"两个repos,并且可能需要稍后手动合并.
最终,这意味着我可以与其中一个repos(例如Mercurial)进行交互,我的脚本将定期提取我可以合并的Git更改,然后它们将被推回.
在Mercurial中,这是微不足道的!我只是从两个回购拉出来,并推动-f/--force以允许推动多个头.然后任何人都可以克隆其中一个回购,合并头,并推回.我想知道如何在Git中做最接近的类似事情.它必须是100%非交互式的,并且必须保持两个repos处于可以无限重复进程的状态(这意味着没有重写历史记录/更改更改集等).
Eev*_*vee 22
在Mercurial意义上,Git分支没有"头".只有一个东西被调用HEAD,它实际上是你目前签出的提交的符号链接.对于像GitHub这样的托管存储库,没有签出提交 - 只有存储库历史本身.(称为"裸"回购.)
这种差异的原因是Git分支名称完全是任意的; 它们不必在存储库的副本之间匹配,您可以随心所欲地创建和销毁它们.[1] Git分支就像Python变量名一样,它可以随意移动并随意粘贴到任何值; Mercurial分支就像C变量,它指的是固定的预分配内存位置,然后填充数据.
因此,当您使用Mercurial时,您有两个同一分支的历史记录,因为分支名称在两个存储库中都是固定有意义的事物.每个历史的叶子都是"头",你通常将它们合并成一个头.
但在Git中,获取远程分支实际上并不会影响您的分支.如果master从中获取分支origin,它只会进入一个名为的分支origin/master.[2] git pull origin master只是两个步骤的瘦糖:将远程分支取入origin/master,然后将其他分支合并到当前分支中.但他们不必有相同的名字; 您的分支可以被称为development或trunk或任何其他.您可以将任何其他分支拉入或合并到其中,然后您可以将其推送到任何其他分支.Git不关心.
这让我回到你的问题:你不能将"第二"分支头推送到远程Git存储库,因为这个概念不存在.您可以推送到具有错位名称(bitbucket_master?)的分支机构,但据我所知,您无法远程更新远程遥控器.
我认为你的计划没有多大意义,因为将未合并的分支暴露给两个存储库,你要么必须将它们合并,要么合并一个,然后将它镜像在另一个之上. ..在这种情况下,您无缘无故地将第二个存储库置于无用状态.
有没有理由你不能这样做:
选择一个规范的存储库 - 我假设BitBucket.克隆它.它变成了origin.
将另一个存储库添加为一个名为的远程存储库github.
有一个简单的脚本定期获取两个遥控器并尝试将github分支合并到origin分支中.如果合并失败,则中止并向您发送电子邮件或其他内容.如果合并很简单,请将结果推送到两个遥控器.
当然,如果您只是在功能分支上完成所有工作,那么这一切都变得不那么重要了.:)
[1]它变得更好:您可以将来自不同存储库的分支合并在一起,这些存储库没有任何共同的历史记录.我这样做是为了整合分开启动的项目; 他们使用不同的目录结构,所以它工作正常.GitHub对其Pages功能使用了类似的技巧:Pages的历史存储在一个名为的分支中,该分支gh-pages位于同一个存储库中,但绝对没有与项目其余部分相同的历史记录.
[2]这是一个白色谎言.该分支仍然被调用master,但它属于被调用的远程origin,斜杠是引用它的语法.区别可能很重要,因为Git对分支名称中的斜杠没有任何疑虑,因此您可以拥有一个名为的本地分支origin/master,这将影响远程分支.
对于类似的东西,我在两个存储库中使用了由webhook触发的简单代码来同步GitLab和Bitbucket master分支:
git pull origin master
git pull gitlab master
git push origin master
git push gitlab master
Run Code Online (Sandbox Code Playgroud)
它可能不是您所需要的,但是对于仅需要同步一个分支的其他人可能会有所帮助。
这是针对该问题的经过测试的解决方案: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
Run Code Online (Sandbox Code Playgroud)
| 归档时间: |
|
| 查看次数: |
38420 次 |
| 最近记录: |