将 Bitbucket Mercurial 存储库转换为 Git。维护分支和历史。在线解决方案
Convert Bitbucket Mercurial repository to Git. Maintain branches and history. Online solution
如何将 Bitbucket Mercurial 存储库(Hg 存储库)转换为 Git 存储库?我想保留分支和提交历史。
我发现在保留所有分支的同时将 Mercurial 存储库转换为 Git 的唯一方法是使用 GitHub 的导入器。这也是最简单的,因为它都是在线完成的。无需本地安装,无需命令行。
主要思想
使用 Github 的导入程序将 Bitbucket Mercurial 存储库转换为 GitHub Git 存储库。然后将其导入回 Bitbucket。
步骤
在 Bitbucket 中:
重命名您要转换的 Mercurial 存储库(如果您希望新的 Git 存储库与您的 Mercurial 存储库具有相同的名称)。您在存储库设置中执行此操作。例如,将其命名为 projectname_mercurial.
获取存储库的克隆 URL。 (在 repo 的主页上,单击克隆并仅获取 URL,例如 https://username@bitbucket.org/username/projectname )
在Github:
如果您还没有帐户,请创建一个https://github.com
使用 GitHub 导入器 https://github.com/new/import
- 从 Bitbucket 输入克隆 URL。
- 给它起个名字。什么都不重要。
- 将其设为私人。 Public 是默认值!
注意:您可以直接将您的密码添加到URL,这将避免在下面的步骤中输入您的凭据(感谢@keith -turkowski 下面的评论)。因此,通过在用户名后添加 :password 来更改您的 bitbucket 克隆 url,如下所示:https://username:password@bitbucket.org/username/projectname
开始在 Github
中导入
等等!当它说你可以时不要关闭页面(我们会给你发电子邮件......)。等待它要求您提供回购凭据。这可能需要几分钟时间。然后输入凭据。 (假设它需要凭据。)
再等等!它会再次要求您提供回购凭据。至少每次都对我有用。 (请参阅上面的注释,将您的密码直接添加到 URL,这样它就不会询问您。)
现在你等到它完成。您将收到一封电子邮件。
完成后,获取 GitHub 项目 URL。当您在 GitHub 项目页面时,它只是网页 URL。
在 Bitbucket 中:
使用“+”>“导入”>“存储库”菜单选项创建新存储库。
- 进入GitHub项目URL
- 选中“需要身份验证”输入您的 GitHub 凭据。
- 输入新的 Git 存储库名称(例如,重命名之前的 Mercurial 项目名称。)
- 将访问级别保持为私有。
在Github:
删除导入的项目:
项目的设置选项卡 > 删除此存储库
还有 hg-git Mercurial plugin 可以将 HG 存储库转换为 Git 存储库。
这是自述文件 (section "Usage") 中的相关部分:
Hg-Git can also be used to convert a Mercurial repository to Git. You can use
a local repository or a remote repository accessed via SSH, HTTP or HTTPS. Use
the following commands to convert the repository (it assumes you're running this
in $HOME).
$ mkdir git-repo; cd git-repo; git init; cd ..
$ cd hg-repo
$ hg bookmarks hg
$ hg push ../git-repo
The hg bookmark is necessary to prevent problems as otherwise hg-git
pushes to the currently checked out branch confusing Git. This will
create a branch named hg in the Git repository. To get the changes in
master use the following command (only necessary in the first run,
later just use git merge or rebase).
$ cd git-repo
$ git checkout -b master hg
注意 hg-git 只理解 Mercurial bookmarks,不理解 Mercurial branches!
(因为它被设计成双向转换,并且没有 Git 等同于 Mercurial 的命名分支 - Git 分支更像是 Mercurial 书签)
如果您的 Mercurial 存储库有您要保留的命名分支,您需要在转换之前为每个分支创建一个书签。
我也尝试了 GitHub 的导入器(在另一个答案中提到),但更喜欢 hg-git,因为我对最终结果有更多的控制权。
我不喜欢 GitHub 导入器的地方在于它使用 "strange" 电子邮件地址创建提交。
即使 HG 存储库中的提交与我的 GitHub 用户具有相同的电子邮件地址,进口商仍然要求我将提交映射到现有的 GitHub 用户。
即使我 select 我自己的用户和 GitHub UI 中的提交看起来像是我的用户所做的,但 repo 中的实际地址(当我克隆它时)看起来像这样:
Christian Specht <123456+christianspecht@users.noreply.github.com>
使用git-hg,您可以create a text file with "mappings" from the existing HG committers to the desired Git committers。
来自 link 的示例:
johnny = John Smith <jsmith@foo.com>
dougie = Doug Johnson <dougiej@bar.com>
因此,如果 HG 存储库有来自提交者 johnny
的提交,它们将在转换后的 Git 存储库中自动更改为 John Smith <jsmith@foo.com>
。
我听说这个脚本有效。不确定它是否转换分支。
我发现 https://github.com/frej/fast-export 可以正确地将 Mercurial 分支迁移到 Git 分支(与仅适用于 Mercurial bookmarks[=30= 的 hg-git 形成对比]).
Fast-export 在本地(副本)存储库上运行,因此它不是完全在线的。快速导出包含如何创建新的本地 Git 存储库并填充它的说明。
在我的例子中,我在 Mercurial 中留下了多个分支头,给出了这个错误:
Error: repository has at least one unnamed head: hg r493
我可以使用 "hg strip 493" 或进行合并来摆脱这些头。
我还必须修复一些提交的作者字段,使用 "authors file" 和 -A 切换到快速导出以映射格式错误的作者字段,如 README 中所述。
之后fast-export接受了repo。
您还需要通过 Bitbucket 网络界面创建一个新的 Bitbucket 存储库。
然后推送到 Bitbucket。此示例使用已配置的 SSH 进行设置:
git remote add origin git@bitbucket.org:<user_name>/<repo_name>
git push --all origin
如何将 Bitbucket Mercurial 存储库(Hg 存储库)转换为 Git 存储库?我想保留分支和提交历史。
我发现在保留所有分支的同时将 Mercurial 存储库转换为 Git 的唯一方法是使用 GitHub 的导入器。这也是最简单的,因为它都是在线完成的。无需本地安装,无需命令行。
主要思想
使用 Github 的导入程序将 Bitbucket Mercurial 存储库转换为 GitHub Git 存储库。然后将其导入回 Bitbucket。
步骤
在 Bitbucket 中:
重命名您要转换的 Mercurial 存储库(如果您希望新的 Git 存储库与您的 Mercurial 存储库具有相同的名称)。您在存储库设置中执行此操作。例如,将其命名为 projectname_mercurial.
获取存储库的克隆 URL。 (在 repo 的主页上,单击克隆并仅获取 URL,例如 https://username@bitbucket.org/username/projectname )
在Github:
如果您还没有帐户,请创建一个https://github.com
使用 GitHub 导入器 https://github.com/new/import
- 从 Bitbucket 输入克隆 URL。
- 给它起个名字。什么都不重要。
- 将其设为私人。 Public 是默认值!
注意:您可以直接将您的密码添加到URL,这将避免在下面的步骤中输入您的凭据(感谢@keith -turkowski 下面的评论)。因此,通过在用户名后添加 :password 来更改您的 bitbucket 克隆 url,如下所示:https://username:password@bitbucket.org/username/projectname
开始在 Github
中导入等等!当它说你可以时不要关闭页面(我们会给你发电子邮件......)。等待它要求您提供回购凭据。这可能需要几分钟时间。然后输入凭据。 (假设它需要凭据。)
再等等!它会再次要求您提供回购凭据。至少每次都对我有用。 (请参阅上面的注释,将您的密码直接添加到 URL,这样它就不会询问您。)
现在你等到它完成。您将收到一封电子邮件。
完成后,获取 GitHub 项目 URL。当您在 GitHub 项目页面时,它只是网页 URL。
在 Bitbucket 中:
使用“+”>“导入”>“存储库”菜单选项创建新存储库。
- 进入GitHub项目URL
- 选中“需要身份验证”输入您的 GitHub 凭据。
- 输入新的 Git 存储库名称(例如,重命名之前的 Mercurial 项目名称。)
- 将访问级别保持为私有。
在Github:
删除导入的项目: 项目的设置选项卡 > 删除此存储库
还有 hg-git Mercurial plugin 可以将 HG 存储库转换为 Git 存储库。
这是自述文件 (section "Usage") 中的相关部分:
Hg-Git can also be used to convert a Mercurial repository to Git. You can use
a local repository or a remote repository accessed via SSH, HTTP or HTTPS. Use
the following commands to convert the repository (it assumes you're running this
in $HOME).
$ mkdir git-repo; cd git-repo; git init; cd ..
$ cd hg-repo
$ hg bookmarks hg
$ hg push ../git-repo
The hg bookmark is necessary to prevent problems as otherwise hg-git
pushes to the currently checked out branch confusing Git. This will
create a branch named hg in the Git repository. To get the changes in
master use the following command (only necessary in the first run,
later just use git merge or rebase).
$ cd git-repo
$ git checkout -b master hg
注意 hg-git 只理解 Mercurial bookmarks,不理解 Mercurial branches!
(因为它被设计成双向转换,并且没有 Git 等同于 Mercurial 的命名分支 - Git 分支更像是 Mercurial 书签)
如果您的 Mercurial 存储库有您要保留的命名分支,您需要在转换之前为每个分支创建一个书签。
我也尝试了 GitHub 的导入器(在另一个答案中提到),但更喜欢 hg-git,因为我对最终结果有更多的控制权。
我不喜欢 GitHub 导入器的地方在于它使用 "strange" 电子邮件地址创建提交。
即使 HG 存储库中的提交与我的 GitHub 用户具有相同的电子邮件地址,进口商仍然要求我将提交映射到现有的 GitHub 用户。
即使我 select 我自己的用户和 GitHub UI 中的提交看起来像是我的用户所做的,但 repo 中的实际地址(当我克隆它时)看起来像这样:
Christian Specht <123456+christianspecht@users.noreply.github.com>
使用git-hg,您可以create a text file with "mappings" from the existing HG committers to the desired Git committers。
来自 link 的示例:
johnny = John Smith <jsmith@foo.com>
dougie = Doug Johnson <dougiej@bar.com>
因此,如果 HG 存储库有来自提交者 johnny
的提交,它们将在转换后的 Git 存储库中自动更改为 John Smith <jsmith@foo.com>
。
我听说这个脚本有效。不确定它是否转换分支。
我发现 https://github.com/frej/fast-export 可以正确地将 Mercurial 分支迁移到 Git 分支(与仅适用于 Mercurial bookmarks[=30= 的 hg-git 形成对比]).
Fast-export 在本地(副本)存储库上运行,因此它不是完全在线的。快速导出包含如何创建新的本地 Git 存储库并填充它的说明。
在我的例子中,我在 Mercurial 中留下了多个分支头,给出了这个错误:
Error: repository has at least one unnamed head: hg r493
我可以使用 "hg strip 493" 或进行合并来摆脱这些头。
我还必须修复一些提交的作者字段,使用 "authors file" 和 -A 切换到快速导出以映射格式错误的作者字段,如 README 中所述。
之后fast-export接受了repo。
您还需要通过 Bitbucket 网络界面创建一个新的 Bitbucket 存储库。
然后推送到 Bitbucket。此示例使用已配置的 SSH 进行设置:
git remote add origin git@bitbucket.org:<user_name>/<repo_name>
git push --all origin