gpt4 book ai didi

GitHub 操作将 repo 作为 git 子模块 checkout

转载 作者:行者123 更新时间:2023-12-04 15:18:53 25 4
gpt4 key购买 nike

背景

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

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

  • 克隆包含的项目
  • 检查具有特定推送/PR SHA 的子模块
  • 使用子模块构建项目

问题

标准Checkout v2 action 不支持这样的工作流。
相反,我根据 $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

这适用于推送,但不适用于 pull 请求
在 PR 上我得到这样的东西:

fatal: reference is not a tree: 48fd1d918a25e7544969d13949b1d436f525412c

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

例子

问题

  • 为什么 $GITHUB_SHA 在 PR 的情况下是错误的?如果是 PR,它代表什么?
  • 是否有更好的方法来实现我想要做的事情?

澄清

如果不清楚 - 有问题的 PR 是在 子模块 的 repo 上,而不是在主(包含)项目 repo 上。
该操作在子模块 repo 上运行,并检查包含模块和子模块。

这个问题与以下事实有关:PR(子模块)的 $GITHUB_SHA 似乎并不代表对子模块的提交,尽管我预计它会。


更新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 的 checkout 仍然失败:

fatal: reference is not a tree

因此,从 PR 来自的原始 repo 中获取 - 没有帮助。
pull_request.head.sha 看起来是正确的(这次是正确的 SHA),但是 git checkout 甚至失败了!不知道为什么。


更新2

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

      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 获取头部
  • git_url 获取所有 PR
  • 正在尝试 checkout github.sha。这适用于推送但不适用于 PR
  • 如果上述操作失败,请检查 github.event.pull_request.head.sha。这适用于 PR 但不适用于推送....

然而,同样的问题仍然存在——

  • 为什么 github.sha 在 PR 的情况下是错误的?如果是 PR,它代表什么?
  • 有没有更好的方法来实现我正在尝试做的事情,而不是从远程获取所有 PR 并同时尝试 github.shagithub.event.pull_request。 head.sha?

最佳答案

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

显然,在 PR 的情况下,github.sha(或 $GITHUB_SHA)表示生成的提交的 SHA,该提交是通过将基础 merge 到头部,而不是基础更改的 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 的 merge 提交。
两者都由 github.sha 表示。

关于GitHub 操作将 repo 作为 git 子模块 checkout ,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/63795736/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com