hg git 同步的一种方式
One way hg to git sync
我有一个 Mercurial 存储库,其中包含一个我正试图逐渐拆分的单体项目。在执行这些操作时,我想我会将新的子项目转换为 git,从而实现单向同步。
关于我在做什么的更多细节:
- hg 存储库和新的 git 存储库位于私有 bitbucket 云帐户中。
- 我想在拆分时保留提交历史记录
- 我们所有的开发都是基于 Windows(尽管我愿意使用基于 unix 的系统进行迁移)
- 最初的 repo 已有 7 年历史,它有各种标签、关闭的分支、一些不支持 git 字符的分支。但更重要的是,如果我只能迁移 default/master(如果它能帮助我完成工作并且不意味着丢失历史记录)
,我会很高兴
- 由于我们正在逐步转换 repo 中的一些项目(假设我有 30 个项目,我想逐步移动它们),我需要以一种方式从 hg 同步到 git。我不害怕合并,我很高兴将我的新 repo 工作保留在 master 之外,然后随着我们进行的 hg 更改而 rebase。
- 我知道我们的 mercurial 存储库配置不正确(我看到了多个头等),但是当我深入研究 mercurial backbone.
时,我超出了我的舒适区
到目前为止,我尝试了几个工具,例如快速导出、mercurial hg hggit 插件。但是,我正在努力寻找好的分步工具。 (以及该线程中的几乎所有方法 Convert Mercurial project to Git)
快速导出是给我最好结果的工具,我能够一次又一次地迁移项目,但是当我尝试重新同步时,我开始出现错误,比如分支在外部修改和多个头。
现在我已经更详细地解释了我的问题,我可以提出问题了。
什么是最好的方法和工具让我能够以单向方式进行 hg 到 git 迁移?
此外,如何确保我的 Mercurial 存储库配置正确以避免在迁移到 git 时出现任何潜在问题?
经过无数次尝试,我想我找到了一种以一致的方式做我想做的事情的方法。为了将来参考,这是以下步骤:
安装必要的工具
为 Windows
安装 Git
独立安装 Tortoise HG 或 Mercurial
安装Python 2.7(目前不支持快速导出Python 3.X)
打开命令行提示符(运行 作为管理员)。
检查是否可以 运行 git,mercurial 和 python 如下:
$ git
$ mercurial
$ python
如果您已经安装了上面的其他软件并且出现错误,您需要设置路径,在我的例子中我只需要为 Python 设置。所以我做了:
$ setx path "%path%;C:\Python27"
重新启动命令提示符,一切就绪。
安装快速导出并克隆 mercurial 和 git 存储库
创建一个干净的目录,以便将工作包含在其中(在我的例子中,除了同步项目之外,我不会将此目录中的存储库用于任何其他用途)。例如:
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 文件夹和 select "Git Bash here"
然后我让我的本地 git 回购区分大小写,这有助于这个过程,但它是一件好事,因为我 运行 过去遇到过区分大小写的文件夹的问题。只是做:
git config core.ignoreCase false
触发同步
我终于做到了:
$ c:\syncprojects\fast-export\hg-fast-export.sh -r c:\syncprojects\mercurialrepo -A c:\syncprojects\authors --force
如果一切顺利(这不一定总是发生,出于多种原因,我在 mercurial 中遇到了问题,我尝试同步到 git 回购中的本地更改问题).
我们需要做的就是检查头部并将更改推送到远程,这样:
$ 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 仓库中。
- 直到我完全满意并且能够停止同步,我才会有一个
包含我日常所做的更改的分支,以及
定期将 master 合并回那个分支。
- 不要使用这个repos进行开发,fast-export存储里面的数据
可能会丢失并使重新同步项目非常
很难实现。将存储库克隆到一个单独的位置(请
小心检查此回购协议中的其他分支
同样的原因)。
我有一个 Mercurial 存储库,其中包含一个我正试图逐渐拆分的单体项目。在执行这些操作时,我想我会将新的子项目转换为 git,从而实现单向同步。
关于我在做什么的更多细节:
- hg 存储库和新的 git 存储库位于私有 bitbucket 云帐户中。
- 我想在拆分时保留提交历史记录
- 我们所有的开发都是基于 Windows(尽管我愿意使用基于 unix 的系统进行迁移)
- 最初的 repo 已有 7 年历史,它有各种标签、关闭的分支、一些不支持 git 字符的分支。但更重要的是,如果我只能迁移 default/master(如果它能帮助我完成工作并且不意味着丢失历史记录) ,我会很高兴
- 由于我们正在逐步转换 repo 中的一些项目(假设我有 30 个项目,我想逐步移动它们),我需要以一种方式从 hg 同步到 git。我不害怕合并,我很高兴将我的新 repo 工作保留在 master 之外,然后随着我们进行的 hg 更改而 rebase。
- 我知道我们的 mercurial 存储库配置不正确(我看到了多个头等),但是当我深入研究 mercurial backbone. 时,我超出了我的舒适区
到目前为止,我尝试了几个工具,例如快速导出、mercurial hg hggit 插件。但是,我正在努力寻找好的分步工具。 (以及该线程中的几乎所有方法 Convert Mercurial project to Git)
快速导出是给我最好结果的工具,我能够一次又一次地迁移项目,但是当我尝试重新同步时,我开始出现错误,比如分支在外部修改和多个头。
现在我已经更详细地解释了我的问题,我可以提出问题了。
什么是最好的方法和工具让我能够以单向方式进行 hg 到 git 迁移?
此外,如何确保我的 Mercurial 存储库配置正确以避免在迁移到 git 时出现任何潜在问题?
经过无数次尝试,我想我找到了一种以一致的方式做我想做的事情的方法。为了将来参考,这是以下步骤:
安装必要的工具
为 Windows
安装 Git独立安装 Tortoise HG 或 Mercurial
安装Python 2.7(目前不支持快速导出Python 3.X)
打开命令行提示符(运行 作为管理员)。
检查是否可以 运行 git,mercurial 和 python 如下:
$ git
$ mercurial
$ python
如果您已经安装了上面的其他软件并且出现错误,您需要设置路径,在我的例子中我只需要为 Python 设置。所以我做了:
$ setx path "%path%;C:\Python27"
重新启动命令提示符,一切就绪。
安装快速导出并克隆 mercurial 和 git 存储库
创建一个干净的目录,以便将工作包含在其中(在我的例子中,除了同步项目之外,我不会将此目录中的存储库用于任何其他用途)。例如:
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 文件夹和 select "Git Bash here"
然后我让我的本地 git 回购区分大小写,这有助于这个过程,但它是一件好事,因为我 运行 过去遇到过区分大小写的文件夹的问题。只是做:
git config core.ignoreCase false
触发同步
我终于做到了:
$ c:\syncprojects\fast-export\hg-fast-export.sh -r c:\syncprojects\mercurialrepo -A c:\syncprojects\authors --force
如果一切顺利(这不一定总是发生,出于多种原因,我在 mercurial 中遇到了问题,我尝试同步到 git 回购中的本地更改问题).
我们需要做的就是检查头部并将更改推送到远程,这样:
$ 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 仓库中。
- 直到我完全满意并且能够停止同步,我才会有一个 包含我日常所做的更改的分支,以及 定期将 master 合并回那个分支。
- 不要使用这个repos进行开发,fast-export存储里面的数据 可能会丢失并使重新同步项目非常 很难实现。将存储库克隆到一个单独的位置(请 小心检查此回购协议中的其他分支 同样的原因)。