Skip to content

Instantly share code, notes, and snippets.

@josemarcosrf
Forked from 0xjac/private_fork.md
Last active September 14, 2020 11:31
Show Gist options
  • Save josemarcosrf/82f0ec52b214b751591a448e18249ce4 to your computer and use it in GitHub Desktop.
Save josemarcosrf/82f0ec52b214b751591a448e18249ce4 to your computer and use it in GitHub Desktop.
Create a private fork of a public repository

The correct way of creating a private frok by duplicating the repo is documented here.

We assume the following:

  • Old or original repo is: git@github.com:<user>/<old-repo>.git
  • New mirror will be: git@github.com:<your_username>/mirror.git

For this, the commands are:

  1. Create a bare clone of the repository. (This is temporary and will be removed so just do it wherever.)

    git clone --bare git@github.com:<user>/<old-repo>.git
  2. Create a new private repository on Github and name it mirror.

    If you are unable to create a private repo, you can request unlimited private repos as a studant by getting the student pack from Github.

  3. Mirror-push your bare clone to your new mirror repository.

    Replace <your_username> with your actual Github username in the url below.

    cd <old-repo>
    git push --mirror git@github.com:<your_username>/mirror.git
  4. Remove the temporary local repository you created in step 1.

    cd ..
    rm -rf <old-repo>
  5. You can now clone your mirror repository on your machine (in my case in the code folder).

    cd ~/code
    git clone git@github.com:<your_username>/mirror.git
  6. If you want, add the original repo as remote to fetch (potential) future changes. Make sure you also disable push on the remote (as you are not allowed to push to it anyway).

    git remote add upstream git@github.com:<user>/<old-repo>.git
    git remote set-url --push upstream DISABLE

    You can list all your remotes with git remote -v. You should see:

    origin	git@github.com:<your_username>/mirror.git (fetch)
    origin	git@github.com:<your_username>/mirror.git (push)
    upstream	git@github.com:<user>/<old-repo>.git (fetch)
    upstream	DISABLE (push)
    

    When you push, do so on origin with git push origin.

    When you want to pull changes from upstream you can just fetch the remote and rebase on top of your work.

      git fetch upstream
      git rebase upstream/master

    And solve the conflicts if any

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment