我有一个包含git子模块的项目,两者都托管在GitHub上。
子模块源是作为项目的一部分构建的,子模块中的更改可能会影响包含的项目。
我的目标是确保子模块不会破坏包含的项目。
为此,我试图在子模块存储库上创建一个GitHub操作,该操作在push / pull时执行以下操作:
标准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(子模块)的似乎不代表对子模块的提交。
我进行了另一次尝试:
尝试将其作为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
即使是失败了!不知道为什么。
最终,我找到了解决方法!
这是“签出子模块”的运行步骤:
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
github.sha
。这适用于推送,但不适用于PRgithub.event.pull_request.head.sha
。这适用于PR,但不适用于推送...。但是,同样的问题仍然存在-
github.sha
在PR的情况下出错?在PR的情况下代表什么?github.sha
和github.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,而不是基础更改提交本身的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] 删除。
我来说两句