使用hg命令同时操作git和hg

Use hg commands to operate git and hg simultaneously

我有一个 Mercurial 存储库和一个 git 存储库。两者都使用相同的代码和相同的变更集。

当我对我的 hg 存储库进行任何更改、提交并将其推送到 hg 存储库时,相同的更改也应该被推送到 git 存储库。这可能吗?怎么样?

在 mercurial 存储库上启用扩展 hg-git 并使用 post-commit 和 post-changegroup 挂钩。在这些挂钩中推送到 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

另请阅读 hg help 关于 hgrc / hooks 的内容。

跟进 planemaker 的回答

  1. 安装 hg-git 扩展程序
  2. (为简单起见,非强制)将远程 git-repo 添加到本地存储库的 [paths] 部分
  3. 手工推送到Git-repo,推送成功
  4. 在存储库 hg push GIT[hooks] 部分创建传出挂钩,其中 GIT - 来自 [paths][=51= 的 git-存储库的名称]
  5. 玩得开心

最终笔记和示例

当心:在 两个 案例中在回购中触发传出挂钩:推送和捆绑。在使用 bundle 的情况下额外推送到 GIT 不会在 repote Git 中做任何危险(更准确地说 - 什么都不做,因为没有任何推送),但如果你想要完美,你可以(在简单的 if 中)检查名为 HG_SOURCE 的环境变量的值,仅当它等于 "push"

时才推送

我真正的两个远程仓库

[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

这样我将在推送到 SF 的回购后推送到 GitHub 的回购 - 并且可以从 any Mercurial 客户端完成推送:命令行, TortoiseHG,聪明Git.

(我不使用挂钩名称,因为它现在是单挂钩,我必须运行选美用我的密钥访问Git-repo 的 ssh 类型在推送到 sf 之前)

对于纯CLI用例,您还可以使用懒惰的方式:创建alias,这将结合新命令中的两个推送和从命令行推送仅此命令,而不是 "classic" hg push。对于我的示例回购协议,它可能类似于(没有错误检查的脏快速示例)

[alias]
pushc = !hg push && hg push github

并且只有 hg pushc 用于推送