使用Git但向Mercurial推送?

7
我有了一份新工作,但他们使用 mercurial 作为版本控制器,我的经验大部分是在 git 上。我试着学习 mercurial,但它的分支方式(即使使用像书签这样的扩展)对我来说完全没有意义。有人知道用 git 本地使用且推送到 mercurial 的方法吗?
我尝试了 hg-git 插件,并已经达到了可以在 git 中提交并将这些更改推送到远程 mercurial 存储库的地步,但我遇到的问题是无论我找到了什么教程,似乎都不能将 mercurial 中的新更改拉回 git 中(这在这一点上使整个过程毫无用处)。如果您有关于如何设置 hg-git 以向 mercurial 推送的链接,请让我知道。
解决方案(我认为):
根据 Lazy Badger 的评论,我认为这是可行的: http://ryanzec.com/index.php/blog/details/9

6
或者你可以学习使用Mercurial! - msarchet
2
使用 Git 已经很长时间了,我已经掌握了一种适合我的完美工作流程,而 Mercurial 并不支持这种工作流程(至少在花费几个小时研究 Mercurial 后似乎是这样)。如果我找不到使用 Git 的方法,学习 Mercurial 将是最后的选择(即,如果我不能想出使用 Git 的方法,我将用上班的第一天来学习 Mercurial)。 - ryanzec
4
强烈推荐学习使用hg。我在工作中使用过hg和git,它们在80%的用例上非常相似。 - Matt Ball
2
学习Mercurial,庆幸你的公司没有使用CVS(像我的公司一样) - Paul S
1
@ryanzec,你能描述一下你的工作流程吗?这样我们就可以看看它是否能在Hg世界中找到匹配项。 - gizmo
显示剩余6条评论
3个回答

3

你可以使用git来处理Mercurial端点,但与逆向操作(hg -> git)不同的是,你需要在同一位置拥有两个版本控制系统两个仓库

  1. Install Mercurial
  2. Install hg-git extension for Mercurial
  3. Make sure you've enabled the Hg bookmark extension in your .hgrc
  4. Add to your .hgrc:

    [git]
    intree=1
    
  5. Clone your Mercurial repo

    hg clone ... repo
    
  6. Go to repo

    cd repo
    
  7. Create a local bookmark tracking your Mercurial default branch - this is what will be exported to your Git

    hg bookmark hg/default -r default
    
  8. Export to the git repo

    hg gexport
    
  9. Configure Hg to ignore the Git repo

    echo ".git" >> .hg/hgignore
    
  10. Configure Git to ignore the Hg repo

    echo ".hg*" >> .git/info/exclude
    
  11. Configure Git to ignore the same things as Mercurial

    git config core.excludesfile `pwd`/.hg/hgignore
    
  12. Have your master branch track the exported Hg default branch

    git branch --track master hg/default
    git reset --hard
    
  13. Work and commit to Git as usual

  14. Export your changes to Hg

    hg gimport
    
  15. Push all to the world

    hg push
    

对于日常工作,请重复执行13-15步骤。

附注:从 HG 到 Git 的工作会产生更少的操作和头痛。


首先,在第12步,我必须反转分支的顺序为:git branch --track master hg/default:但是当我尝试执行:git reset --hard时,我会收到错误消息:fatal: This operation must be run in a work tree。如果我执行git init,则该错误消息会消失,但我仍然处于无法将hg中的新更改合并回git的同一位置。 - ryanzec
你可能漏了一个点 - 两个仓库都在共同的工作副本内,即使用 both 工作副本执行所有操作,只需分别提交。工作副本合并也遵循此规则。对于12的错误,我是根据记忆写的,非常抱歉。 - Lazy Badger
不太确定你的意思(假设WC代表Working Copy)。我理解这个WC既是hg又是git的WC,然而我原以为通过这种工作流程,我可以在git中工作,然后只需执行hg gexport和hg gimport来推送和拉取hg和git之间的更改。但是这个设置甚至不允许我使用任何有用的git命令,因为git认为它不是一个工作树(比如checkout commit等)。我不确定我漏掉了什么使得git实际工作起来的东西(除非我应该执行git init)。 - ryanzec
那我是要创建一个空的 Git 仓库,然后按照这些步骤进行吗?这样我就可以在 /path/to/empty/git/repo 创建一个空的仓库,然后执行 hg clone ... /path/to/empty/git/repo? - ryanzec
是的,我期望它应该那样工作,但需要测试我的“不太正规的想法”,可能还需要修复。 - Lazy Badger
显示剩余2条评论

3

思考一下,看看是否有替代方案,同样不完美但更加简单(希望如此) - 在三层架构的链式结构中使用了3个版本库(2个Mercurial + 1个Git)

它们有(本地)名称,在下面会用到:

  • Master(hg)- 公司的中央Mercurial版本库
  • Mediator(hg)- 用于翻译变更集的中间件,是Master的克隆版本
  • WorkHorse(git)- 最终工作区,开始时为空

Mediator具有几乎与解决方案1中的hg-repo相同的设置(hg-git,书签),除了hgrc的[paths]部分中的一个细节 - 将出现两个路径:Master和WorkHorse,以便能够在Master和WorkHorse之间双向拉取|推送

流程:

  • Mediator从Master拉取变更,推送到WorkHorse(变更集原封不动地呈现,与解决方案1相反)
  • 所有(几乎?对合并不确定)工作都在WorkHorse上进行
  • Mediator从WorkHorse拉取变更,推送到Master

假设主repo是远程repo(通常在不同的服务器上),中介repo是已经设置了hg-git的本地repo,而工作repo是完全使用git的本地repo(并且与中介repo相连),这样理解是否正确?如果是这样,我该如何让中介repo以一种方式拉取主repo的变更集,以便当我从工作repo更新时,git会像之前的解决方案那样拉取变更集? - ryanzec
你(在中介者上)只需“推送WorkHorse” - 因为WorkHorse是中介者的镜像,没有最新的从Master拉取的变更集,所以推送将仅推送新数据。是的,你必须在WorkHorse git存储库中创建。但我看到,你无法从git克隆hg存储库,因此-初始填充也将从中介者推送到空的WorkHorse。 - Lazy Badger
我应该使用什么命令从中介者推送到工作马,这是我有点困惑的部分。 - ryanzec
仔细想了想,我觉得我知道你的意思了。我得尝试一下我认为你在谈论的东西。 - ryanzec
我认为你需要添加第二个本地 git 存储库到混合中,然后你基本上可以按照预期使用 hg-git。在设置它时仍然需要一些丑陋的解决方法,但之后,在 git 和 hg 中工作应该会非常顺畅。我需要尝试一下,但如果它有效,我很可能会很快写一篇长篇博客文章介绍它。 - ryanzec
显示剩余4条评论

1

1
不幸的是,这个项目现在已经不再维护,并且与Mercurial 3.2或更高版本不兼容,但是我的分支仍然可以使用:https://github.com/fingolfin/git-remote-hg - Max Horn

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接