3

我有一个 mercurial 存储库,其中包含一个我正在尝试逐步拆分的整体项目。在执行这些操作时,我想我会将新的子项目转换为 git,从而实现单向同步。

关于我在做什么的更多细节:

  • hg 存储库和新的 git 存储库位于私有 bitbucket 云帐户中。
  • 我想在进行拆分时保留提交历史记录
  • 我们所有的开发都是基于 Windows 的(尽管我愿意使用基于 unix 的系统进行迁移)
  • 最初的 repo 已有 7 年历史,它有各种各样的标签、封闭的分支、一些带有不受支持的 git 字符的分支。但更重要的是,如果我只能迁移默认/主服务器,我会很高兴(如果它可以帮助我完成工作并且不意味着丢失历史记录)
  • 随着我们逐渐转换 repo 中的一些项目(假设我有 30 个项目并且我想逐步移动它们),我需要做一种从 hg 同步到 git 的方式。我不害怕合并,我很高兴将我的新 repo 工作保留在 master 之外,然后随着 hg 的变化而变基。
  • 我知道我们的 mercurial repo 配置不正确(我看到了多个头等),但是当我深入研究 mercurial 主干时,我已经超出了我的舒适区。

到目前为止,我尝试了几种工具,例如快速导出、mercurial hg hggit 插件。但是,我正在努力寻找好的分步工具。(以及此线程Convert Mercurial project to Git中的几乎所有方法)

fast-export 是给我带来最佳结果的工具,我能够一次性迁移项目,但是当我尝试重新同步时,我开始遇到错误,例如外部修改了分支和多个头。

现在我更详细地解释了我的问题,我可以提出这个问题。

什么是最好的方法和工具让我能够做一个单一的方式 hg 到 git 迁移?

另外,如何确保我的 mercurial 存储库已正确配置,以避免在迁移到 git 时出现任何潜在问题?

4

1 回答 1

3

经过无数次的尝试,我想我找到了一种方法可以始终如一地做我想做的事。为了将来参考,这是步骤:

安装必要的工具

为 Windows 安装 Git

独立安装 Tortoise HG 或 Mercurial

安装 Python 2.7(fast-export 目前不支持 Python 3.X)

打开命令行提示符(以管理员身份运行)。

检查是否可以运行 git、mercurial 和 python,如下所示:

$ git

$ mercurial

$ python

如果您已经安装了上述其他的并且遇到错误,则需要设置路径,在我的情况下,我只需要为 Python 执行此操作。所以我做了:

$ setx path "%path%;C:\Python27"

重新启动命令提示符,一切都应该准备就绪。

安装 fast-export 并克隆 mercurial 和 git repos

创建一个干净的目录,以便将工作包含在其中(在我的情况下,除了同步项目之外,我不会将此目录中的存储库用于其他任何事情)。例如:

c:\syncprojects

从内部c:\syncprojects开始克隆快速导出

$ git clone https://github.com/frej/fast-export.git fast-export

然后克隆 mercurial 项目

$ hg clone https://bitbucket.org/user/mercurialrepo

然后克隆你要同步到的git项目

$ git clone https://bitbucket.org/user/gitrepo gitrepo

它帮助我正确配置了作者文件,所以我做到了

$ cd mercurialrepo
$ hg log | grep user: | sort | uniq | sed 's/user: *//' > ../authors

然后打开在 c:\syncprojects 中创建的作者文件,确保作者文件与以下内容匹配:

bob=Bob Jones <bob@company.com>
bob@localhost=Bob Jones <bob@company.com>
bob <bob@company.com>=Bob Jones <bob@company.com>

下一步是开始实际迁移,对于这一步,我觉得使用 git bash 更舒服,所以我这样做了:在 Windows 资源管理器中,右键单击 gitrepo 文件夹并选择“Git Bash here”

然后我让我的本地 git repo 区分大小写,这有助于该过程,但这是一件好事,因为我过去遇到了区分大小写文件夹的问题。做就是了:

git config core.ignoreCase false 

触发同步

最后我做到了:

$ c:\syncprojects\fast-export\hg-fast-export.sh -r c:\syncprojects\mercurialrepo -A c:\syncprojects\authors --force

如果一切顺利(这不一定总是发生,由于多种原因,我在 mercurial 中遇到了问题,在我试图同步到的 git repo 中存在本地更改问题)。

我们需要做的就是检查头部并将更改推送到远程,如下所示:

$ git checkout HEAD
$ git push -u origin master

下次您要进行同步时,只需重复最后一部分:

$ c:\syncprojects\fast-export\hg-fast-export.sh -r c:\syncprojects\mercurialrepo -A c:\syncprojects\authors --force

$ git checkout HEAD

$ git push -u origin master

不幸的是,这些步骤并没有看起来那么快,但这是我发现解决问题的更简洁和一致的方式。

还有一些提示:

  • 我没有在新创建的 git repo 中合并任何新代码来掌握。
  • 在我完全满意并能够停止同步之前,我将拥有一个包含我日常所做更改的分支,并定期将 master 合并回该分支。
  • 不要将此存储库用于开发,快速导出将数据存储在可能丢失的存储库中,并使重新同步项目非常难以实现。将 repos 克隆到一个单独的位置(出于同样的原因,请小心检查此 repos 中的其他分支)。
于 2017-07-13T08:56:24.520 回答