Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/git/24.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
有没有办法将拉取请求从bitbucket hg repo迁移到github git repo?_Git_Github_Mercurial_Bitbucket_Pull Request - Fatal编程技术网

有没有办法将拉取请求从bitbucket hg repo迁移到github git repo?

有没有办法将拉取请求从bitbucket hg repo迁移到github git repo?,git,github,mercurial,bitbucket,pull-request,Git,Github,Mercurial,Bitbucket,Pull Request,我的bitbucket hg repo中有一个旧的pull请求,我想尝试并集成它,但同时我已经将该repo迁移到github并将其转换为git。有没有办法迁移这个请求?如果没有,集成它最简单的方法是什么?我在中提到了基本过程。本质上,您需要原始Mercurial存储库,以及发送到原始Bitbucket服务器以进行PR的变更集 (注意:我实际上没有这样做。这都是理论上的。不过,理论上很简单。同样的技术也适用于从CVS、SVN或Perforce进行转换。关键是要构建一个临时Git存储库,其中包含一组

我的bitbucket hg repo中有一个旧的pull请求,我想尝试并集成它,但同时我已经将该repo迁移到github并将其转换为git。有没有办法迁移这个请求?如果没有,集成它最简单的方法是什么?

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

(注意:我实际上没有这样做。这都是理论上的。不过,理论上很简单。同样的技术也适用于从CVS、SVN或Perforce进行转换。关键是要构建一个临时Git存储库,其中包含一组要复制的PR提交。我们将en copy只是将PR提交到链接到GitHub存储库的Git存储库。)


最好的(或最短的或最容易的)实现这一点的方法可能会有所不同,具体取决于一些细节。不过,您可能已经或者至少可以克隆整个原始Mercurial repo及其来自bitbucket的pull请求。这将为您提供一个完整的、自包含的Hg存储库,其中包含一系列变更集,包括最初由您共同创建的所有变更集转换为Git,再加上您的变更集,这是您的PR的一部分

现在,您可以通过任何方式将整个内容转换为新的Git存储库。此Git存储库将或多或少地为每个原始Mercurial变更集提交一次当您故意不转换某些hg提交和/或您有hg标记时会发生这种情况,这些标记会导致新的提交,并转换为不使用提交的Git标记。某些详细信息可能取决于您的转换软件。)

这个新的Git存储库可能与GitHub上的存储库完全无关,与原始的Git转换有不同的提交散列。或者,如果转换很简单,当您构建这个新的Git存储库时,它实际上将使用原始散列ID,因此具有很强的相关性

如果它真的是如此密切相关,那么问题实际上就消失了。只需为这个Git存储库设置一个远程,即GitHub存储库(或您的分支),然后
Git push
在那里进行额外的提交,并像往常一样进行GitHub PR

如果它不是紧密相关的,那么您最有可能应该做的是使用
git cherry pick
,这似乎是最简单的方法。这里涉及到很多存储库,所以让我们使用一些简单的单字母名称来命名每个存储库:

  • Gmain是GitHub存储库(或您的分支),您希望在其中创建新的PR

  • Glocal是你自己电脑上Gmain的克隆(我将简称为“你的笔记本电脑”,即使你实际上没有使用笔记本电脑,以区别于各种服务器上可能有许多Git存储库)

  • R0是您的Mercurial存储库,其中包含您已经拥有或从Bitbucket上的PR重新克隆的额外提交

  • Rg是您转换为Git后的存储库。此存储库可以直接存在于您的笔记本电脑上。请注意,它在某些分支上有新的提交,几乎是但不完全是,在这种情况下,它可以
    Git push
    ed。问题是,这些提交是在与Gmain中的历史无关的历史上进行的

在Glocal中,在笔记本电脑上,您现在将使用
git remote add
为Rg添加远程:

这将使用Rg中的提交来填充您的Glocal,创建远程跟踪名称,其形式为
recoverer/origin
recoverer/developer
,等等。除了不正确的历史链接之外,您需要的提交现在位于远程跟踪名称上。为具体起见,我将其称为
recoverer/pr123
,但实际名称取决于R0中使用的分支或书签名称,该名称是由转换软件在生成Rg时创建的

请注意,在分支
recoverer/pr123
上,这些提交之前有许多(数十、数百、数千等)Git对提交位于分支上的含义有着奇怪的理解,它通常在多个分支上进行提交。包含提交的分支集会随着时间的推移而动态变化!这与Mercurial非常不同,Mercurial将提交礼貌地保留在其原始分支中因此,您现在的目标是复制仅在
recoverer/pr123
上的提交,而不是在该分支上的提交,比如说,
recoverer/master
,或者它们出现在任何其他分支上的提交

您可以通过散列ID查找这些提交,一次一个,也可以找出哪个名称排除它们。例如,如果
git log recover/master..recover/pr123
显示了正确的提交集,则名称
recover/master
用于排除不需要的提交。通过某种方式,您可以运行
git log recover/pr123
,前面可能有一些排除名称,如下面所示,以验证fy确保您获得了要复制的正确提交集


通过单个哈希ID或此类名称找到要为您的PR复制的提交后,您现在只需运行:

git checkout <branch>
e、 例如,
git cherry pick recoverer/master..recoverer/pr123
。git现在将尝试复制这些提交,或者用易变的术语,将这些提交移植到当前分支。新的提交将进行与原始提交相同的更改,但将是一个新的历史块—一组新的提交将从您检查的提交中增长在您的
git签出分支中退出

一旦一切顺利,您可以
git推送origin
as
git fetch recoverer
git checkout <branch>
git cherry-pick <hashes-or-string>