git push - 没有pull refs的镜像

时间:2017-12-12 15:41:51

标签: git bash github

我正在将一个git repo迁移到另一个。要执行此操作,我会对--mirrorclone操作使用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处理它。

3 个答案:

答案 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