GitHub动作将回购作为git子模块签出

阿米尔·贡纳(Amir Gonnen)

背景

我有一个包含git子模块的项目,两者都托管在GitHub上。
子模块源是作为项目的一部分构建的,子模块中的更改可能会影响包含的项目。

我的目标是确保子模块不会破坏包含的项目。
为此,我试图在子模块存储库上创建一个GitHub操作,该操作在push / pull时执行以下操作:

  • 克隆包含的项目
  • 使用特定的push / PR SHA检出子模块
  • 使用子模块构建项目

问题

标准Checkout v2操作不支持此类工作流程。
相反,我正在根据克隆并签出子模块$GITHUB_SHA,如下所示:

- name: Checkout project
  run: git clone <Project>
- name: Update submodules
  run: git submodule update --init --recursive
- name: Checkout submodule
  working-directory: ./<submodule dir>
      run: |
        git fetch
        git checkout $GITHUB_SHA
- name: Build
  run : make

这对push效果很好,但对pull request效果不好
在PR上,我得到这样的东西:

fatal: reference is not a tree: 48fd1d918a25e7544969d13949b1d436f525412c

$GITHUB_SHA在PR情况下提供的SHA根本找不到。

问题

  • 为什么$GITHUB_SHA在PR的情况下出错?在PR的情况下代表什么?
  • 是否有更好的方法来实现我要完成的任务?

澄清度

如果不清楚-有问题的PR是在子模块的仓库中,而不是在主(包含)项目仓库中。
该操作正在子模块存储库上运行,并检出包含模块和子模块。

该问题与以下事实有关$GITHUB_SHA:(我期望)PR(子模块)的似乎不代表对子模块的提交。


更新1

我进行了另一次尝试:
尝试将其作为Checkout子模块的“运行”步骤:

        git fetch ${{ github.event.repository.git_url }}
        git fetch ${{ github.event.pull_request.head.repo.clone_url }}
        git checkout ${{ github.sha }} || git checkout ${{ github.event.pull_request.head.sha }}

在PR上,两个SHA的检出仍然失败,并且:

fatal: reference is not a tree

因此,从PR的原始回购中获取信息-没有帮助。
pull_request.head.sha看起来是正确的(这是正确的SHA这个时候),但git checkout即使是失败了!不知道为什么。


更新2

最终,我找到了解决方法!
这是“签出子模块”的运行步骤:

      run: |
        git fetch --force ${{ github.event.repository.git_url }} "+refs/heads/*:refs/remotes/origin/*"
        git fetch --force ${{ github.event.repository.git_url }} "+refs/pull/*/head:refs/remotes/origin/pr/*"
        git checkout ${{ github.sha }} || git checkout ${{ github.event.pull_request.head.sha }}

所以我正在做的是:

  • 从中获取磁头 git_url
  • 从中获取所有PR git_url
  • 试图结帐github.sha这适用于推送,但不适用于PR
  • 如果以上方法失败,请结帐github.event.pull_request.head.sha这适用于PR,但不适用于推送...。

但是,同样的问题仍然存在-

  • 为什么github.sha在PR的情况下出错?在PR的情况下代表什么?
  • 是否有更好的方法来实现我要完成的任务,而不是从远程获取所有PR并同时尝试github.shagithub.event.pull_request.head.sha
阿米尔·贡纳(Amir Gonnen)

我在这里找到了答案:https :
//frontside.com/blog/2020-05-26-github-actions-pull_request/#how-does-pull_request-affect-actionscheckout

显然,在PR的情况下,github.sha(或$GITHUB_SHA)表示通过将基础合并到头部创建的结果提交的SHA,而不是基础更改提交本身的SHA。

要获取它,我需要获取refs/pull/*/merge而不是refs/pull/*/head

现在,此运行步骤更有意义:

        git fetch --force ${{ github.event.repository.git_url }} "+refs/heads/*:refs/remotes/origin/*"
        git fetch --force ${{ github.event.repository.git_url }} "+refs/pull/*/merge:refs/remotes/origin/pr/*"
        git checkout ${{ github.sha }}

第一次获取将获取磁头,以进行推送操作。第二个将获取PR的合并提交。
两者均以表示github.sha

本文收集自互联网,转载请注明来源。

如有侵权,请联系[email protected] 删除。

编辑于
0

我来说两句

0条评论
登录后参与评论

相关文章

来自分类Dev

git子模块签出相同的提交

来自分类Dev

在git superproject和子模块中签出

来自分类Dev

git子模块签出相同的提交

来自分类Dev

git子模块添加失败与bitbucket回购

来自分类Dev

git子模块添加失败与bitbucket回购

来自分类Dev

如何跟踪Jenkins无法通过ssh签出git子模块?

来自分类Dev

使用SSH在Azure Pipeline中签出git子模块

来自分类Dev

如何启用Azure管道使用Git签出子模块?

来自分类Dev

Git签出不适用于WordPress的子模块

来自分类Dev

从特定的回购哈希或标签创建git子模块

来自分类Dev

git添加没有回购名称的子模块

来自分类Dev

git添加没有回购名称的子模块

来自分类Dev

如何在GitHub动作中检出子模块?

来自分类Dev

如何将现有的嵌套存储库(已在子目录中签出)添加到父Git存储库作为子模块?

来自分类Dev

如何在GitHub上作为子模块合并上游?

来自分类Dev

如何在git子模块更新和签出后恢复丢失的提交?

来自分类Dev

Git子模块在签出时删除另一个分支

来自分类Dev

使用Git-子模块-稀疏签出时是否可能没有额外的子目录?

来自分类Dev

我如何在不签出的情况下更新git子模块

来自分类Dev

Git子模块在签出时删除另一个分支

来自分类Dev

git&hugo-在github上创建git子模块的问题

来自分类Dev

回购可以递归子模块吗?

来自分类Dev

git存储库的较旧版本作为子模块

来自分类Dev

当它是GitHub库时,Git子模块推送?

来自分类Dev

Git / Github:替换分支的存储库的子模块

来自分类Dev

当它是GitHub库时,Git子模块推送吗?

来自分类Dev

Git子模块混乱

来自分类Dev

更改git子模块

来自分类Dev

管理git子模块

Related 相关文章

热门标签

归档