【问题标题】:git repository mirror with detached head causes error: GH002带有分离头的git存储库镜像导致错误:GH002
【发布时间】:2021-04-06 23:12:30
【问题描述】:

以下代码在 Azure Pipeline 中运行,以将源镜像到另一个 git 存储库。

git remote add --mirror=fetch mirror MIRROR_REPO

git push mirror --progress --prune +refs/remotes/origin/*:refs/heads/* +refs/tags/*:refs/tags/*

当代理运行时,它会在特定提交处检查代码,这会导致具有提交 SHA 名称的分离头。这是代理生成的日志:

 * [new ref]           6ADFB183A4A2C94A2F92DAB5ADE762A47889A5A1 -> origin/6ADFB183A4A2C94A2F92DAB5ADE762A47889A5A1
git checkout --progress --force 6ADFB183A4A2C94A2F92DAB5ADE762A47889A5A1
Note: switching to '6ADFB183A4A2C94A2F92DAB5ADE762A47889A5A1'

我猜这就是git push mirror 命令失败并出现以下错误的原因:

remote: error: GH002: Sorry, branch or tag names consisting of 40 hex characters are not allowed.        
remote: error: Invalid branch or tag name "6ADFB183A4A2C94A2F92DAB5ADE762A47889A5A1"   

我正在寻找一种方法,可以在每次管道运行时将所有分支和标签从我的源存储库推送到我的镜像存储库。

谢谢!

【问题讨论】:

  • 错误信息很清楚:看起来你不能有这么奇怪的分支名称。请注意,提交名称使用小写十六进制字符,而不是大写十六进制字符。无论如何,将它们用作分支名称似乎是个坏主意。
  • 是的,很清楚,这里的问题是名称是由 Azure DevOps 生成的,它不是真正的分支,而是处于分离状态的头部,否则我只会重命名分支
  • * [new ref] 行表明它已经创建了一个引用,而不仅仅是使用了一个分离的HEAD。 (一个 detached-HEAD 可能会工作,但 ref 肯定不行。它没有说 * [new branch] 的事实很有趣:它可能创建了一个非分支 ref。无论如何 GitHub 都拒绝它。)不是确定你可以在这里做些什么;代理的行为很糟糕。
  • 嗨@nor0x。您能否参考答案并尝试跳过默认结帐步骤?如果答案能给你一些帮助,请随时告诉我。谢谢。

标签: git github azure-devops azure-pipelines mirror


【解决方案1】:

远程:错误:GH002:抱歉,不允许包含 40 个十六进制字符的分支或标签名称。

根据我的测试,我可以重现同样的问题。

在 azure devops 默认签出步骤中,它将commitid 设置为[New Ref]。由于这是默认步骤,我们不能干预它的工作方式。

对于解决方法,您可以跳过默认的签出步骤(- checkout: none)并运行 git 命令来签出所有分支和标签。

这是我的示例:

steps:
- checkout: none

- task: PowerShell@2
  inputs:
    targetType: 'inline'
    script: |
      git clone --mirror  sourcerepo

      cd $(build.sourcesdirectory)\reponame
      
      git remote add --mirror=fetch mirror MIRROR_REPO
      
      git push mirror --progress --prune +refs/heads/*:refs/heads/* +refs/tags/*:refs/tags/*

然后它将所有分支和标签成功推送到Github。

【讨论】:

  • 感谢您的回复@Kevin Lu-MSFT - 结帐:无法使用 Azure Pipelines 的 GUI 编辑器配置任何步骤,不幸的是,我目前只能使用可视化编辑器。
  • 嗨@nor0x。对于 Azure Pipelines 的 GUI 编辑器,您可以设置管道变量:Build.SyncSources = false。然后将跳过结帐步骤。
猜你喜欢
  • 2012-10-04
  • 2016-03-19
  • 2015-07-16
  • 2012-08-14
  • 1970-01-01
  • 2020-06-27
  • 2017-07-15
  • 2013-08-01
  • 1970-01-01
相关资源
最近更新 更多