我有一个mercurial存储库和一个git存储库。两者都使用相同的代码和相同的更改集。
当我对我的hg存储库进行任何更改,提交它并将其推送到hg存储库时,同样的更改也应该被推送到git存储库。这可能吗?怎么样?
答案 0 :(得分:1)
在mercurial存储库上启用扩展名hg-git,并使用post-commit和post-changegroup hook。在这些钩子中推送到git存储库。
编辑: 只需将hg-git的非标准扩展名(请参阅http://hg-git.github.io/)放在某处并编辑.hgrc:
[extensions]
hggit = /path/to/hg-git/hggit
[hooks]
changegroup.git = hg push git+https://path/to/git-repo.git
post-commit.git = hg push git+https://path/to/git-repo.git
另请阅读hgrc / hooks上的hg help。
答案 1 :(得分:1)
后续行星制造者的回答
[paths]
部分[hooks]
的{{1}}部分创建传出挂钩,其中GIT - 来自hg push GIT
最终说明和样本
小心:在两个案例中的repo中触发了传出钩子:在推送和捆绑上。在使用捆绑的情况下额外推送到GIT将在编辑Git时没有任何危险(更确切地说 - 什么也不做,因为没有什么可以推送),但如果你想要完美,你可以(简单地说)检查名为HG_SOURCE的环境变量的值,仅当它等于"push"
时才推送我真正的双遥控回购
[paths]
这样我就可以在推送到SF的回购后推送到GitHub的回购 - 并且可以从任何 Mercurial客户端:命令行进行推送, TortoiseHG,SmartGit。
(我不使用钩子名称,因为它现在是单个钩子 ,我必须使用我的密钥运行Pageant来访问ssh类型的Git -repo在推到sf之前)
对于纯CLI用例,您也可以使用惰性方式:create alias,它将在新命令中结合两次推送,并仅使用此命令从命令行推送,而不是"经典" [paths]
github = git+ssh://git@github.com/lazybadger/Fiver-l10n.git
default = ssh://bigbadger@hg.code.sf.net/u/bigbadger/code
...
[hooks]
outgoing = hg push github
。对于我的样本中的repo,它可能类似于(没有错误检查的脏快速样本)
hg push
仅推送[alias]
pushc = !hg push && hg push github