π Mirror GitLab, SourceForge, GitHub, and other Git repositories
π΅ You don't even need to use a GitHub Action!
πΆ Use native Git commands to mirror a repository
Works with any Git repository!
π‘ Try to provide a meta description somewhere on your mirrored repository's page to indicate that it's a mirror of another project and not the original source. You don't want people opening Issues or merge requests against your mirror! π€£
# octocat/my-project [source repository]
# .github/workflows/mirror.yml
name: Mirror
on:
push:
create:
delete:
workflow_dispatch:
jobs:
gitlab-myorg-my-project:
concurrency:
group: ${{ github.workflow }}-gitlab
cancel-in-progress: true
runs-on: ubuntu-latest
steps:
- run: git clone --bare "https://github.com/$GITHUB_REPOSITORY" .
- run: git push --mirror "https://x:$GITLAB_TOKEN@gitlab.com/myorg/my-project.git"
env:
GITLAB_TOKEN: ${{ secrets.MY_TOKEN }}
Make sure you create a GitLab personal access token with the permissions needed to write to the myorg/my-project Git destination repository. Then make sure you add the secret token value to the GitHub settings panel for the source repository.
If you're using a non-public GitHub repository you may need to use gh auth setup-git
to configure your credentials properly.
# octocat/.github [another third repository]
# .github/workflows/mirror.yml
name: Mirror
on:
schedule:
- cron: "36 */6 * * *"
workflow_dispatch:
jobs:
mirror1:
runs-on: ubuntu-latest
steps:
- run: git clone --bare https://gitlab.com/myorg/my-project.git .
- run: git push --mirror "https://x:$GITHUB_TOKEN@github.com/octocat/my-project.git"
env:
GITHUB_TOKEN: ${{ secrets.MY_TOKEN }}
git push --mirror
. It's recommended to use a meta repository like
octocat/.github or myorg/.github to manage mirroring. You can use the same
workflow file for multiple mirroring jobs if you have multiple mirrors you want
to sync.
You'll need to create a GitHub personal access token with write permissions to the contents of the octocat/my-project GitHub repository and then add the secret GitHub token to your third repository that will manage the scheduled syncing.
# octocat/.github [another third repository]
# .github/workflows/mirror.yml
name: Mirror
on:
schedule:
- cron: "36 */6 * * *"
workflow_dispatch:
jobs:
mirror1:
runs-on: ubuntu-latest
steps:
- run: git clone --bare https://git.code.sf.net/p/myorg/my-project .
- run: git push --mirror "https://x:$GITHUB_TOKEN@github.com/octocat/my-project.git"
env:
GITHUB_TOKEN: ${{ secrets.MY_TOKEN }}
git push --mirror
. It's recommended to use a meta repository like
octocat/.github or myorg/.github to manage mirroring. You can use the same
workflow file for multiple mirroring jobs if you have multiple mirrors you want
to sync.
You'll need to create a GitHub personal access token with write permissions to the contents of the octocat/my-project GitHub repository and then add the secret GitHub token to your third repository that will manage the scheduled syncing.