Title说明了一切。我尝试使用了一堆不同的git命令,比如git submodule update --remote --merge和git submodule foreach git pull origin master,它们在我的电脑上运行良好,但在GitHub操作上运行时就不行了。我尝试将git status添加到工作流中,状态只是显示“最新的origin/master,没有要提交的内容”或类似的内容。
git submodule update --remote --merge
git submodule foreach git pull origin master
git status
6ioyuze21#
在父存储库中创建一个新工作流,以同步引用:
name: 'Submodules Sync' on: # Allows you to run this workflow manually from the Actions tab or through HTTP API workflow_dispatch: jobs: sync: name: 'Submodules Sync' runs-on: ubuntu-latest # Use the Bash shell regardless whether the GitHub Actions runner is ubuntu-latest, macos-latest, or windows-latest defaults: run: shell: bash steps: # Checkout the repository to the GitHub Actions runner - name: Checkout uses: actions/checkout@v2 with: token: ${{ secrets.CI_TOKEN }} submodules: true # Update references - name: Git Sumbodule Update run: | git pull --recurse-submodules git submodule update --remote --recursive - name: Commit update run: | git config --global user.name 'Git bot' git config --global user.email 'bot@noreply.github.com' git remote set-url origin https://x-access-token:${{ secrets.GITHUB_TOKEN }}@github.com/${{ github.repository }} git commit -am "Auto updated submodule references" && git push || echo "No changes to commit"
其中
在子(子模块)GitHub操作中,通知父操作更改。
name: 'Submodule Notify Parent' on: push: branches: - main # Allows you to run this workflow manually from the Actions tab workflow_dispatch: jobs: notify: name: 'Submodule Notify Parent' runs-on: ubuntu-latest # Use the Bash shell regardless whether the GitHub Actions runner is ubuntu-latest, macos-latest, or windows-latest defaults: run: shell: bash steps: - name: Github REST API Call env: CI_TOKEN: ${{ secrets.CI_TOKEN }} PARENT_REPO: <my_organization/my-app> PARENT_BRANCH: develop WORKFLOW_ID: <9999999> run: | curl -fL --retry 3 -X POST -H "Accept: application/vnd.github.v3+json" -H "Authorization: token ${{ env.CI_TOKEN }}" https://api.github.com/repos/${{ env.PARENT_REPO }}/actions/workflows/${{ env.WORKFLOW_ID }}/dispatches -d '{"ref":"${{ env.PARENT_BRANCH }}"}'
CI_TOKEN
curl -X GET -H "Authorization: token $CI_TOKEN" https://api.github.com/repos/$PARENT_REPO/actions/workflows
为每个子模块重复创建工作流。对我来说,它工作得非常稳定。如果有的话,请用上面的逻辑添加关于现有github操作的信息。
ejk8hzay2#
您可以通过子模块存储库中的单个操作来实现此目的:
name: Send submodule updates to parent repo on: push: branches: - main jobs: update: runs-on: ubuntu-latest steps: - uses: actions/checkout@v2 with: repository: org/parent_repository token: ${{ secrets.PRIVATE_TOKEN_GITHUB }} submodules: true - name: Pull & update submodules recursively run: | git submodule update --init --recursive git submodule update --recursive --remote - name: Commit run: | git config user.email "actions@github.com" git config user.name "GitHub Actions - update submodules" git add --all git commit -m "Update submodules" || echo "No changes to commit" git push
您需要:
org/parent_repository
PRIVATE_TOKEN_GITHUB
通过此操作,子模块存储库中main分支上的每次推送都将导致一个提交,该提交将更新拉入父存储库。
main
f87krz0w3#
现在一个更好的选择是利用Dependabot自动为子模块创建PR。https://docs.github.com/en/code-security/dependabot/dependabot-version-updates/configuration-options-for-the-dependabot.yml-file#package-ecosystem每天检查子模块是否已更新的示例:输入.github/dependabot.yml
.github/dependabot.yml
version: 2 updates: - package-ecosystem: gitsubmodule schedule: interval: "daily" directory: /
ruyhziif4#
递归地拉取和更新子模块,然后提交到repo。
name: Update submodules # Controls when the action will run. on: # Allows you to run this workflow manually from the Actions tab workflow_dispatch: jobs: # This workflow contains a single job called "update" update: runs-on: ubuntu-latest steps: # Checks-out your repository under $GITHUB_WORKSPACE, so your job can access it - uses: actions/checkout@v2 - name: Pull & update submodules recursively run: | git submodule update --init --recursive git submodule update --recursive --remote - name: Commit & push changes run: | git config --global user.name ${{ secrets.USER_NAME }} git config --global user.email ${{ secrets.USER_EMAIL }} git commit -am "Update submodules" git push
我没有使用像${{ secrets.USER_NAME }}这样的Github秘密,我只是硬编码我的git凭证,因为我很懒,但我想你可能会关心安全性。
${{ secrets.USER_NAME }}
zmeyuzjn5#
你可以将你的GitHub Action源代码与submodule-branch-check这样的源代码进行比较,后者至少是一个git submodule update。检查update --remote是否足以从其自己的远程源拉入。
submodule-branch-check
git submodule update
update --remote
f45qwnt86#
它为我工作,在这里阅读文章https://zenn.dev/ymmmtym/articles/dc741561759a49
name: Update submodules on: push: branches: - dev pull_request: branches: - dev jobs: update_submodules: name: Update submodules runs-on: ubuntu-latest steps: - uses: actions/checkout@v2 with: token : ${{secrets.OOG_TOKEN}} submodules : true - name: Update submodules id: update run: git submodule update --remote --recursive - name: Run git status id: status run: echo "::set-output name=status::$(git status -s)" - name: Add and commit files run: | git add . git config --local user.email "action@github.com" git config --local user.name "GitHub Action" git commit -m "Update submodules at $(date "+DATE: %Y-%m-%d TIME: %H:%M:%S")" if: ${{ steps.status.outputs.status }} - name: Push changes uses: ad-m/github-push-action@master with: github_token: ${{ secrets.GITHUB_TOKEN }} branch: dev if: ${{ steps.status.outputs.status && github.event_name == 'push' }}
uqcuzwp87#
我试过了,对我很有效
- uses: actions/checkout@v3 with: repository: {owner}/repo token: ${{ secrets.PRIVATE_TOKEN_GITHUB }} submodules: recursive - name: submodules recursively run: git submodule update --init --recursive
ca1c2owp8#
我能够实现@Droplet的解决方案!我扩展了它,使用如下矩阵更新多个使用子模块的父repos:
on: push: branches: - master jobs: update_parent_repos: runs-on: ubuntu-latest strategy: matrix: parent_repo: [parent_repo_1, parent_repo_2] steps: - uses: actions/checkout@v3 with: repository: myriadgenetics/${{ matrix.parent_repo }} token: ${{ secrets.ACTIONS_TOKEN }} submodules: 'recursive' - name: Pull & update submodules recursively run: | git submodule update --init --recursive git submodule update --recursive --remote - name: Commit run: | git config user.email "actions@github.com" git config user.name "GitHub Actions - update submodules" git add --all git commit -m "Update submodules" || echo "No changes to commit" git push
如果不是ubuntu-latest,您必须为您的用例的操作运行器使用正确的标签,将parent_repo_1和parent_repo_2更新为您想要在其中更新子模块的父repos的名称,并为您的用例使用正确的令牌名称。出于某种原因,我必须包括submodules: 'recursive',否则在“Pull &”中运行命令时会遇到问题递归更新子模块”。
ubuntu-latest
parent_repo_1
parent_repo_2
submodules: 'recursive'
8条答案
按热度按时间6ioyuze21#
如果您需要通过GitHub操作自动更新对子模块的引用:
在父存储库中创建一个新工作流,以同步引用:
其中
在子(子模块)GitHub操作中,通知父操作更改。
其中
CI_TOKEN
运行curl:为每个子模块重复创建工作流。
对我来说,它工作得非常稳定。如果有的话,请用上面的逻辑添加关于现有github操作的信息。
ejk8hzay2#
您可以通过子模块存储库中的单个操作来实现此目的:
您需要:
org/parent_repository
作为示例)。PRIVATE_TOKEN_GITHUB
)通过此操作,子模块存储库中
main
分支上的每次推送都将导致一个提交,该提交将更新拉入父存储库。f87krz0w3#
现在一个更好的选择是利用Dependabot自动为子模块创建PR。
https://docs.github.com/en/code-security/dependabot/dependabot-version-updates/configuration-options-for-the-dependabot.yml-file#package-ecosystem
每天检查子模块是否已更新的示例:输入
.github/dependabot.yml
ruyhziif4#
简单的解决方案
递归地拉取和更新子模块,然后提交到repo。
我没有使用像
${{ secrets.USER_NAME }}
这样的Github秘密,我只是硬编码我的git凭证,因为我很懒,但我想你可能会关心安全性。zmeyuzjn5#
你可以将你的GitHub Action源代码与
submodule-branch-check
这样的源代码进行比较,后者至少是一个git submodule update
。检查
update --remote
是否足以从其自己的远程源拉入。f45qwnt86#
它为我工作,在这里阅读文章https://zenn.dev/ymmmtym/articles/dc741561759a49
uqcuzwp87#
我试过了,对我很有效
ca1c2owp8#
我能够实现@Droplet的解决方案!我扩展了它,使用如下矩阵更新多个使用子模块的父repos:
如果不是
ubuntu-latest
,您必须为您的用例的操作运行器使用正确的标签,将parent_repo_1
和parent_repo_2
更新为您想要在其中更新子模块的父repos的名称,并为您的用例使用正确的令牌名称。出于某种原因,我必须包括submodules: 'recursive'
,否则在“Pull &”中运行命令时会遇到问题递归更新子模块”。