我正在将一个git repo迁移到另一个。要执行此操作,我会对--mirror
和clone
操作使用push
标记。
这样做除了最后的失败外,导致我的bash脚本失败,这似乎是孤立的拉取请求:
! [remote rejected] refs/pull/1/head -> refs/pull/1/head (The current action can only be performed by the system.)
! [remote rejected] refs/pull/1/merge -> refs/pull/1/merge (The current action can only be performed by the system.)
! [remote rejected] refs/pull/2/head -> refs/pull/2/head (The current action can only be performed by the system.)
! [remote rejected] refs/pull/3/head -> refs/pull/3/head (The current action can only be performed by the system.)
是否有必要迁移拉取请求?
当我git push --mirror
时,如何省略拉取请求?
我见过修改配置文件的引用,但我更愿意尽可能在CLI处理它。
答案 0 :(得分:5)
为了避免推送拉取请求,您可以推送所需的引用(通过命名它们),而不是让--mirror
找到它们。 This writeup提供了一个选项(一旦您安排了本地克隆):
$ git push --prune git@example.com:/new-location.git +refs/remotes/origin/*:refs/heads/* +refs/tags/*:refs/tags/*
您希望通过列出.git/refs
(省略.git/refs/pull
)在脚本中以编程方式生成参考列表,以确保您选择可能存在的其他参考在那里像replacement refs或其他自定义引用。
是否有必要迁移拉取请求?
我认为你无法做到。如果您要从一个GitHub仓库迁移到另一个,the behavior you're seeing is expected:
远程refs / pull / namespace是只读的。
refs/pull/
命名空间特定于GitHub,因此,如果您要从其他服务(例如Bitbucket)迁移或迁移到其他服务(例如Bitbucket),则迁移PR需要支持。 Bitbucket doesn't have support for that sort of thing,其他人可能会以不同方式实施。
答案 1 :(得分:5)
使用--mirror
指示Git复制所有引用,就像refspec +refs/*:refs/*
一样。 (使用git clone
它也会设置获取镜像:一个裸克隆,其默认refspec与此+refs/*:refs/*
相同,默认情况下启用剪枝。)
正如您所看到的,一些Git服务器甚至拒绝对某些引用进行强制更新。特别是,GitHub为自己的目的保留refs/pull/
命名空间。
是否有必要迁移拉取请求?
据我所知,在GitHub上甚至不可能可能(尽管当然GitHub人员可以从他们的角度来做)。
当我
git push --mirror
时,如何省略拉取请求?
我认为最简单的方法是在git clone --mirror
步骤后删除它们:
git for-each-ref --format 'delete %(refname)' refs/pull | git update-ref --stdin
但您也可以明确推送您关注的引用,这些引用可能只是refs/heads/
和refs/tags/
下的引用,也可能是refs/replace/
和/或refs/notes/
。< / p>
答案 2 :(得分:0)
以下命令对我有用:
git show-ref | cut -d' ' -f2 | grep 'pull' | xargs -r -L1 git update-ref -d
所以,对我来说完整的步骤是:
git clone --mirror https://github.com/exapmple/repository-to-mirror
cd repository-to-mirror
git remote set-url --push origin https://github.com/exampleuser/mirrored
git show-ref | cut -d' ' -f2 | grep 'pull' | xargs -r -L1 git update-ref -d
git push --mirror