Skip to content

πŸ”„ Mirror GitLab, SourceForge, GitHub, and other Git repositories

License

Notifications You must be signed in to change notification settings

actions4git/mirror

Use this GitHub action with your project
Add this Action to an existing workflow or create a new one
View on Marketplace

Folders and files

NameName
Last commit message
Last commit date

Latest commit

 

History

29 Commits
 
 
 
 
 
 
 
 

Repository files navigation

Mirror Git repository

πŸ”„ Mirror GitLab, SourceForge, GitHub, and other Git repositories

Example mirror

😡 You don't even need to use a GitHub Action!
πŸ”Ά Use native Git commands to mirror a repository
:octocat: Works with any Git repository!

Usage

GitHub Actions Git

πŸ’‘ 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! 🀣

Mirror from GitHub to GitLab

GitHub GitLab

# 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.

Mirror from GitLab to GitHub

GitLab GitHub

# 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 }}

⚠️ We are using a third repository. Why? If we stored our workflow in the destination repository on GitHub it would be overwritten by the incoming 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.

Mirror from SourceForge to GitHub

SourceForge GitHub

# 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 }}

⚠️ We are using a third repository. Why? If we stored our workflow in the destination repository on GitHub it would be overwritten by the incoming 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.