Wie kann man in Github-Aktionen in ein anderes Repository pushen?

Lesezeit: 5 Minuten

Benutzeravatar von Bjørn Olav Jalborg
Bjørn Olav Jalborg

In Github Actions versuche ich, einige Änderungen an einem anderen Repo als dem Repository vorzunehmen, zu dem der Workflow gehört. Siehe diesen Code:

      - name: Generate API module
        env:
          GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }}
        run: |

          git clone https://user:[email protected]/owner/my-repo # This works

          cd my-repo
          git config user.name "user"
          git config user.email "[email protected]"

          git checkout -b api-version-$COMMIT

          touch new-file.sh
          git add new-file.sh
          git commit -m "Add new file"

          git remote -v # Prints:
          # origin ***github.com/owner/my-repo.git (fetch)
          # origin ***github.com/owner/my-repo.git (push)

          git push --set-upstream origin api-version-$COMMIT # This does not work
          git push --set-upstream https://user:[email protected]/owner/my-repo api-version-$COMMIT # This does not work either

Ich kann das Owner/Repo-Repository problemlos klonen. Ich kann den neuen Zweig auschecken, die Datei hinzufügen und die Änderungen übernehmen. Das Problem tritt auf, wenn ich versuche, die Änderungen in den Upstream zu verschieben. Das funktioniert überhaupt nicht und ich bekomme diesen Fehler:

remote: Repository not found.
fatal: repository 'https://github.com/owner/my-repo/' not found

Ich vermute nur, dass es etwas mit der Authentifizierung zu tun hat. Die GITHUB_TOKEN ist ein persönliches Zugriffstoken und verfügt über alle möglichen Berechtigungen.

Was gibt?

Es gibt eine zusätzliche Konfiguration, die stillschweigend übergeben werden kann $GITHUB_TOKEN in AUTHORIZATION Header, der schlecht mit einem anderen Repo git auth interagiert.

Sie müssen es entfernen, bevor Sie es in ein anderes Repo verschieben:

git config --unset-all http.https://github.com/.extraheader

Lösung aus einem anderen SO-Thread-Authentifizierungsfehler beim Versuch, ein Repo mit Github-Aktionen zu kopieren

Ich bin mir nicht sicher, ob Sie das schon lösen konnten, aber ich dachte, ich werde es posten einer potenzielle Lösung für zukünftige Leute, die auf dasselbe Problem stoßen, so wie ich. Ich hatte das gleiche Problem, das sich schließlich als fehlende Bearbeitungsberechtigungen für das Repo herausstellte, auf das ich übertragen wollte. Leider ist die Fehlermeldung von GitHub (remote: Repository not found.) war wirklich nicht hilfreich, um auf das eigentliche Problem hinzuweisen (ich nehme an, es ist eine Frage der Verschleierung aus Sicherheitsgründen, aber dann – wenn dieses Konto bereits dazu in der Lage war clone das Repo und haben Lesezugriff darauf – was ist der Sinn der Verschleierung? Dies ist offensichtlich ein Autorisierungsproblem für einen bereits authentifizierten Benutzer 🤷🏻‍♂️). So oder so – ich konnte das Problem lösen, indem ich Schreibzugriff auf das Repo erhielt. Nachdem ich die erforderlichen Berechtigungen erhalten hatte, konnte ich erfolgreich in dieses Repo pushen.

  • Habe es nie herausgefunden. Ich habe ein Monorepo erstellt, damit es funktioniert.

    – Björn Olav Jalborg

    8. November 2021 um 8:32 Uhr

GITHUB_TOKEN ist auch eine Systemvariable, siehe doc hier. Möglicherweise stoßen Sie auf einen Konflikt zwischen Ihrem Geheimnis und dem System. Das Umbenennen Ihres Geheimnisses in etwas anderes könnte funktionieren.

  • Danke, aber leider nicht. Gleiches Ergebnis, wenn die Variable einen anderen Namen hat.

    – Björn Olav Jalborg

    17. Oktober 2020 um 10:15 Uhr

  • Sind Sie sicher, dass das Token über alle erforderlichen Berechtigungen verfügt?

    – Davide D’Alto

    4. Dezember 2020 um 17:35 Uhr

  • Positiv, mehrfach nachgebaut! Ich habe nie herausgefunden, was falsch war. Am Ende habe ich den gesamten Code in einem Repo zusammengeführt.

    – Björn Olav Jalborg

    1. Februar 2021 um 19:55 Uhr


Sie müssen ein GitHub Private Access Token mit Berechtigungen für Repositories erstellen und es in einem Geheimnis speichern, sagen wir mal ACTIONS_GITHUB_TOKEN in dem Repository, in dem Sie Ihren Workflow/Ihre Aktion ausführen.

Übergeben Sie dann dieses Token an die Checkout-Aktion:

push:
  runs-on: ubuntu-latest
  steps:
    - uses: actions/checkout@v3
      with:
        repository: <repo name>
        ref: 'master'
        token:  ${{ secrets.ACTIONS_GITHUB_TOKEN }}
    - name: setup git config
      run: |
        git config user.name "GitHub Actions Bot"
        git config user.email "<>"
    - <make changes and commit >
    - run: git push origin master

# .github/workflows/deploy.yml
name: Deploy GitHub Pages to external repository

on:
  # https://docs.github.com/en/actions/using-workflows/workflow-syntax-for-github-actions#on
  #  push:
  #    branches: [ "main" ]
  push:
    tags:
      - "*"

jobs:
  build:
    runs-on: ubuntu-latest

    strategy:
      matrix:
        node-version: [18.x]

    steps:
      - uses: actions/checkout@v3

      - name: Use Node.js ${{ matrix.node-version }}
        uses: actions/setup-node@v3
        with:
          node-version: ${{ matrix.node-version }}
          cache: yarn

      - name: Install dependencies
        run: yarn install --frozen-lockfile

      - name: Build website
        run: yarn build

      - name: Deploy to external repository
        uses: cpina/github-action-push-to-another-repository@main
        env:
          # 🏗️ <internal repository>, run GitHub Action.
          # 🎁 <external repository>, receiving Artifacts.
          #
          # Way 1: using Personal Access Token
          # @see https://cpina.github.io/push-to-another-repository-docs/setup-using-personal-access-token.html#setup-personal-access-token
          # 1.1 Generate Personal Access Token: <external repository>/<Avatar>/Settings/Developer settings/Personal access tokens/Generate new token
          #     Select `No expiration` and Check `✅️ repo    Full control of private repositories`, Generate and then Copy the Token
          # 1.2 Then make the token available to the GitHub Action: <internal repository>/Settings/Secrets/Actions/New repository secret
          #     Name: EXTERNAL_REPOSITORY_PERSONAL_ACCESS_TOKEN, Value Paste the Token
          API_TOKEN_GITHUB: ${{ secrets.EXTERNAL_REPOSITORY_PERSONAL_ACCESS_TOKEN }}
          # Way 2: using SSH deploy keys
          # @see https://cpina.github.io/push-to-another-repository-docs/setup-using-ssh-deploy-keys.html#setup-ssh-deploy-keys
          # 2.1 Generate an SSH key in terminal (Leave the passphrase empty)
          # 2.2 Add public key in the external repository: <external repository>/Settings/Deploy keys/Add deploy key
          #     Name: DEPLOY_PUBLIC_KEY, Value Paste the public key. Enable "✅️ Allow write access"
          # 2.3 Add private key in the source repository: <external repository>/Settings/Secrets/Actions/New repository secret
          #     Name: DEPLOY_PRIVATE_KEY, Value Paste the private key.
          # SSH_DEPLOY_KEY: ${{ secrets.DEPLOY_PRIVATE_KEY }}

        with:
          # GitHub Action output files
          source-directory: public/
          destination-github-username: <external org/user name>
          destination-repository-name: <external repository>
          user-email: <your email>
          # It defaults to `main`
          target-branch: "gh-pages"

      - name: Test get variable exported by push-to-another-repository
        run: echo $DESTINATION_CLONED_DIRECTORY

Benutzeravatar von Александр Савин
Александр Савин

Dafür gibt es eine Aktion:

name: Push File(or Dir) to another repository

on: push

jobs:
  copy-file:
    runs-on: ubuntu-latest
    steps:
    - name: Checkout
      uses: actions/checkout@v2

    - name: Push to another repo
      uses: dmnemec/copy_file_to_another_repo_action@main
      env:
        API_TOKEN_GITHUB: ${{ secrets.API_TOKEN_GITHUB }} 
      with:
        source_file: 'test2.md'
        destination_repo: 'another_repo/release-test'
        destination_folder: 'test-dir' # optional
        user_email: '[email protected]'# your email
        user_name: 'dmnemec'           # your login
        commit_message: 'A custom message for the commit'

https://github.com/dmnemec/copy_file_to_another_repo_action

1439560cookie-checkWie kann man in Github-Aktionen in ein anderes Repository pushen?

This website is using cookies to improve the user-friendliness. You agree by using the website further.

Privacy policy