有什么方法可以将拉取请求从bitbucket hg存储库迁移到github git存储库?

问题描述 投票:0回答:1

我在bitbucket hg存储库中有一个旧的pull请求,我想尝试将其集成,但是与此同时,我已将存储库迁移到github并将其转换为git。有什么办法可以迁移此拉取请求?如果没有,那么进行集成的最痛苦的方法是什么?

git github mercurial bitbucket pull-request
1个回答
0
投票

我在a comment中提到了基本过程。本质上,您需要原始的Mercurial存储库,并将其更改集发送给原始的Bitbucket服务器以进行PR。

((注:我实际上并没有做过。这只是理论上的。理论上很简单。同样的技术也可以用于CVS或SVN或Perforce的转换。关键是构建一个临时的Git。具有正确提交的仓库,然后再提交将要复制的PR提交集。然后,我们仅将PR提交复制到链接到GitHub存储库的Git存储库中。)


最佳(或最短或最简单)的方法可能会有所不同,具体取决于一些细节。但是,大概您已经或者至少可以克隆整个原始Mercurial存储库及其从bitbucket的拉取请求。这将为您提供一个完整的,自包含的Hg存储库,其中包含一堆变更集,包括最初转换为Git的所有变更集以及此后属于PR的变更集。

您现在可以通过任意方式将整个内容转换为new

Git存储库。每个原始Mercurial变更集都会对该Git存储库进行一次提交,或多或少。 (“或多或少”发生在您有意不转换某些hg提交和/或您有hg标签的情况下,这会导致新的提交,这些新的提交又转换为不使用提交的Git标签。一些详细信息是可能取决于您的转换软件。)

此新的Git存储库可能

与GitHub上的存储库完全无关,其提交哈希与原始转换为Git不同。或者,如果转换很简单,那么当您构建这个新的Git存储库时,它实际上会使用原始的哈希ID,因此紧密相关!

如果确实是如此紧密相关,那么问题实际上就消失了。只需为此Git存储库(即GitHub存储库(或其分支))设置一个远程站点,然后在其中git push进行其他提交,然后照常进行GitHub PR。

如果密切相关,那么您最有可能应该使用的是git cherry-pick。这似乎是最简单的路径。这里涉及很多存储库,因此让我们使用一些简单的单字母名称来为每个名称命名:

  • [G main

    是要在其上创建新PR的GitHub存储库(或其分支)。
  • [G local

  • 是您在自己的计算机上G main的克隆。 (即使您实际上并未使用笔记本电脑,我也会简称为“您的笔记本电脑”,以将其与各种服务器上的Git存储库区分开来。)
  • R [[0

  • 是您的Mercurial存储库,其中包含额外的提交,您已经拥有或从Bitbucket的PR中重新克隆了它。
  • R [[g
  • 是转换为Git后的存储库。该存储库可以直接在笔记本电脑上使用。请注意,它已经在某个分支上具有了新的提交,几乎是(在这种情况下,不是完全)准备好git push。问题在于这些提交所处的历史与

    G main

    。中的历史无关。G local中,在笔记本电脑上,您现在将使用git remote add

    R g

    添加一个遥控器:
    git remote add recoverer <url> The将会成为笔记本电脑上R
    g
    的路径。 (您可以根据需要将file:///放在其前面,尽管如果您不这样做-如果您直接使用完整的

    R g

    路径-您的Git对于不使用它会更聪明。如果由于某些原因R g在某些服务器上,请使用允许您的Git到达该服务器的URL,您的Git将需要分配新的本地磁盘空间以在所有提交,一会儿。)
    现在运行:git fetch recoverer 这将用

    R

    g
    的提交(整个历史记录)填充您的

    G local

    ,并创建格式为recoverer/originrecoverer/develop的远程跟踪名称, 等等。现在,您想要的提交(除了错误的历史链接之外)都位于远程跟踪名称上。具体来说,我将其称为recoverer/pr123,但实际名称取决于您在R 0中使用的分支或书签名称,该名称是由转换软件创建为[[R g
    请注意,在分支recoverer/pr123上的这些提交之前是recoverer/pr123上的许多提交(数十个,数百个,数千个,等等)。 Git,对于提交在分支上意味着什么的奇怪概念,通常在多个分支上具有提交。 contain个提交的一组分支随时间动态变化!这与Mercurial截然不同,Mercurial礼貌地保留在其原始分支中。因此,您现在的目标是复制recoverer/pr123上的[[only提交,而不是复制recoverer/master或其他出现在其上的其他分支上的提交。您可以通过它们的哈希ID一次找到这些提交,也可以找出哪些名称可以排除它们。例如,如果git log recoverer/master..recoverer/pr123恰好显示正确的提交集,则名称recoverer/master可用于排除

    unwanted提交。您将以一种或另一种方式运行git log recoverer/pr123,也许在其前面带有一些排除名称,以验证您是否获得了要复制的正确提交集。已经找到要复制给您的PR的提交-无论是通过单个哈希ID还是通过这种名称,您现在都可以运行:git checkout <branch>

    (其中branch是您要复制这些提交的位置

    to

    ,如果您愿意,它可以是一个新分支),然后:git cherry-pick <hashes-or-string>
    例如git cherry-pick recoverer/master..recoverer/pr123。 Git现在将尝试复制-或使用Mercurial术语

    graft

    -这些将提交到当前分支。新的提交将进行与原始提交相同的更改,但是将成为您在git checkout branch步骤中检出的提交的新的历史记录集-一组新的提交。
    一旦一切顺利,您就可以照常git push origin并照常发出GitHub拉取请求。您也可以git remote remove recoverer

    G local

    删除所有recoverer/*名称,并从G
    local

    R g

    的链接删除,您可以删除

    R g本身。 (选择完樱桃之后,您可以随时执行所有这些操作。)如果Git与R g共享G local中的内容,则磁盘空间删除R g后,它会释放。如果没有,由于它与R g的链接已消失,Git最终将“垃圾回收”额外的磁盘空间。

    © www.soinside.com 2019 - 2024. All rights reserved.