将多个 hg 存储库转换为具有多个分支的单个 git 存储库

发布于 2024-10-14 12:35:43 字数 419 浏览 2 评论 0原文

我正在从 Mercurial 切换到 git,并一直在使用 hg-fast-export 成功。现在我遇到了一个棘手的情况。我有一个项目,每个分支使用单独的 hg 存储库,我想将它们转换为具有“适当”分支的单个 git 存储库,如果可能的话保留我的 hg 更改集。

所以当前的结构看起来像这样 - 每个文件夹都是一个 hg 存储库:

Project-v1.0
Project-v2.0
Project-v3.0

我希望最终得到一个名为“Project”的 git 存储库,其中包含 3 个分支:v1.0、v2.0 和 v3.0。

这可能吗?

I am switching to git from Mercurial and have been using hg-fast-export successfully. Now I have a tricky situation. I have a project which is using separate hg repositories per-branch and I want to convert these to a single git repository with 'proper' branches, keeping my hg changesets if possible.

So the current structure looks like this - each folder is an hg repository:

Project-v1.0
Project-v2.0
Project-v3.0

I want to end up with a single git repository called 'Project' that contains 3 branches, v1.0, v2.0 and v3.0.

Is this possible?

如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。

扫码二维码加入Web技术交流群

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。

评论(2

再见回来 2024-10-21 12:35:43

当 hg 存储库是一个基础存储库的克隆时,您可以使用 hggit 扩展将它们导出到一个 git 仓库。假设您的分支位于目录 b1/、b2/ 和 b3/ 中,那么您所需要的就是

cd b1; mkdir ../gb1 && git init --bare ../gb1 && hg push ../gb1; cd ..
cd b2; mkdir ../gb1 && git init --bare ../gb2 && hg push ../gb2; cd ..
cd b3; mkdir ../gb1 && git init --bare ../gb3 && hg push ../gb3; cd ..
# now you have one git repo for each hg branch

cd gb1
git remote add gb2 ../gb2
git remote add gb3 ../gb3
git fetch --all
# now you have all branches in the gb1 repo
rm -r ../gb2 ../gb3
# the other repos are now not used anymore

如果不同的 hg 存储库不相关,则必须使用 VonC 提到的移植点解决方案。

When the hg repositories are clones from one base repo, you can use the hggit extension to export them into one git repo. Say your branches live in the directories b1/, b2/ and b3/, then all you need is to

cd b1; mkdir ../gb1 && git init --bare ../gb1 && hg push ../gb1; cd ..
cd b2; mkdir ../gb1 && git init --bare ../gb2 && hg push ../gb2; cd ..
cd b3; mkdir ../gb1 && git init --bare ../gb3 && hg push ../gb3; cd ..
# now you have one git repo for each hg branch

cd gb1
git remote add gb2 ../gb2
git remote add gb3 ../gb3
git fetch --all
# now you have all branches in the gb1 repo
rm -r ../gb2 ../gb3
# the other repos are now not used anymore

If the different hg repos are unrelated, you have to use the graft point solution which VonC mentioned.

噩梦成真你也成魔 2024-10-21 12:35:43

这应该可以通过以下方式实现:

  • 从三个 Mercurial 仓库中创建 3 个不同的 Git 仓库,
  • Project-v2.0 历史记录导入 Project-v1.0 Git 仓库(通过添加 >Project-v2.0 作为远程并在“v2.0”分支中获取它:创建了 2 个不同的根)
    并且,通过移植点,链接两个分支在一起(v1.0 分支的 HEAD 成为 v2.0 分支第一次提交的父级)。
  • 使用 filter-branch 来制作这些移植点永久(即不限于您的存储库)

(对 Project-v3.0 重复,将第一个分支提取到单独的 v3.0 分支中,嫁接到 < v2.0 分支的 code>HEAD 和过滤器分支以使移植永久)

您有类似的场景(尽管它是关于“前置一些历史记录”,而不是“附加” )在SO问题“如何将过去添加到git中存储库?”。

This should be possible with:

  • creating 3 distinct Git repos from the three Mercurial ones
  • importing Project-v2.0 history into Project-v1.0 Git repo (by adding Project-v2.0 as a remote and fetching it in a 'v2.0' branch: 2 distinct roots are created)
    And, through a graft point, linking the two branches together (the HEAD of v1.0 branch becomes the parent of the first commit of v2.0 branch).
  • using filter-branch to make those graft points permanent (i.e. not limited to your repo)

(repeat for the Project-v3.0, fetch into the first one into a separate v3.0 branch, grafted to the HEAD of v2.0 branch, and filter-branch to make the graft permanent)

You have a similar scenario (although it is about "prepend some history", not "append") in the SO question "How to prepend the past to a git repository?".

~没有更多了~
我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
原文