如何解决GitHub动作将回购作为git子模块签出
背景
我有一个包含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
这对推送很有效,但对拉请求无效。
在PR上,我得到这样的东西:
fatal: reference is not a tree: 48fd1d918a25e7544969d13949b1d436f525412c
$GITHUB_SHA
在PR情况下提供的SHA根本找不到。
示例
问题
- 在PR的情况下,
$GITHUB_SHA
为什么出错?在PR的情况下代表什么? - 是否有更好的方法来实现我的目标?
澄清
如果不清楚-有问题的PR是在子模块的存储库中,而不是在主(包含)项目存储库中。
该操作正在子模块存储库上运行,并检出包含模块和子模块。
该问题与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的签出仍然失败,并且::
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
取头 - 从
git_url
获取所有PR - 尝试结帐
github.sha
。这适用于推送,但不适用于PR - 如果以上操作失败,请检出
github.event.pull_request.head.sha
。这适用于PR,但不适用于推送。...
但是,仍然存在相同的问题-
- 在PR的情况下,
github.sha
为什么出错?在PR的情况下代表什么? - 是否有更好的方法来实现我要执行的任务,而不是从远程获取所有PR并尝试
github.sha
和github.event.pull_request.head.sha
?
解决方法
很明显,在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
表示。
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。