Skip to content

Instantly share code, notes, and snippets.

@0xjac
Last active April 16, 2024 14:15
Show Gist options
  • Save 0xjac/85097472043b697ab57ba1b1c7530274 to your computer and use it in GitHub Desktop.
Save 0xjac/85097472043b697ab57ba1b1c7530274 to your computer and use it in GitHub Desktop.
Create a private fork of a public repository

The repository for the assignment is public and Github does not allow the creation of private forks for public repositories.

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

For this assignment 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:usi-systems/easytrace.git
  2. Create a new private repository on Github and name it easytrace.

    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 easytrace repository.

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

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

    cd ..
    rm -rf easytrace.git
  5. You can now clone your easytrace repository on your machine (in my case in the code folder).

    cd ~/code
    git clone git@github.com:<your_username>/easytrace.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:usi-systems/easytrace.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>/easytrace.git (fetch)
    origin	git@github.com:<your_username>/easytrace.git (push)
    upstream	git@github.com:usi-systems/easytrace.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

  7. Make your easytrace repo available in your Vagrant VM by adding the following to your Vagrantfile

    Replace "~/code/easytrace" with your local path to the easytrace repo.

    config.vm.synced_folder "~/code/easytrace", "/easytrace"
    
  8. Reload your VM to enable the synced folder (in the folder containing your Vagrant file).

    vagrant reload 
  9. The easytrace repo is available at /easytrace once you ssh into the machine.

@kiltannen
Copy link

Nowadays you should be able to just use the Import a Repository feature. Not sure if you can import someone's repo straight away, but I first did a public fork and then imported that as private.

So this just works cleanly and well. THANKS!

@selma-belhadj
Copy link

Thank you so much!!!

@AaganMaskey
Copy link

Nowadays you should be able to just use the Import a Repository feature. Not sure if you can import someone's repo straight away, but I first did a public fork and then imported that as private.

Thank you, it helped me!

@jaguardo
Copy link

jaguardo commented Dec 8, 2020

If you use the "import" feature, can you then pull from the public repo and merge it into the private repo fork?

@harsh778
Copy link

Thanks! Helped me big time.

@JanezCim
Copy link

When i make a private fork. can i later make pull requests to the original repository?

Im also interested in this.

@0mars
Copy link

0mars commented Jan 3, 2021

When i make a private fork. can i later make pull requests to the original repository?

Im also interested in this.

I guess the solution is to have your fork public, then private fork your public fork, then make a patch on your public fork

@flieks
Copy link

flieks commented Mar 17, 2021

@0mars you mean syncing your public fork (with upstream) and then merge your public fork with your private fork ? Or how do you patch your fork or even merge another repo (public fork into private repo) ?

@JimCownie
Copy link

Minor typo: The correct way of creating a private frok by duplicating the repo is documented here.
frok => fork

@danielkellyio
Copy link

very helpful! Thanks!

@MedadRufus
Copy link

Nowadays you should be able to just use the Import a Repository feature. Not sure if you can import someone's repo straight away, but I first did a public fork and then imported that as private.

Perfect.

@gartisk
Copy link

gartisk commented Jul 4, 2021

Thanks for the explanation! Before I had noticed the github import repo solution, I made a bash script using your instructions and publish it here

https://github.com/gartisk/pseudo-fork

@nftgeek
Copy link

nftgeek commented Jul 20, 2021

Thanks

@eugenedw
Copy link

Thank you!

@yx-chan131
Copy link

If you use the "import" feature, can you then pull from the public repo and merge it into the private repo fork?

I tried with my own personal project, yes you can still pull from the public repo. What I did was after I import the repo, I used these two commands:

git remote add upstream git@github.com:usi-systems/easytrace.git
git remote set-url --push upstream DISABLE

@barryperez
Copy link

Thanks - just found this gist very useful!

@nkrsic
Copy link

nkrsic commented Sep 22, 2021

Cheers!

@hieu-van
Copy link

Nice

@apimaker001
Copy link

Great!

@Vitaly-A-Ivanov
Copy link

Well written. Thanks

@erdoukki
Copy link

erdoukki commented Feb 9, 2022

Thanks...
Useful!

@gersomonline
Copy link

Even though I do not use this repo, the process of making a private fork helped a lot, thank you!

@ahbanavi
Copy link

Thx a lot.

@vmendivil
Copy link

Thank you!

@pat-richter
Copy link

Thank you. Step 6 should contain cd easytrace ;-)

@ZekiJohn
Copy link

Thank you. very helpful 💡💡

@monsefoster
Copy link

Thank you!

@hapylestat
Copy link

the one thing - it is not forking but duplicating, it means - you wouldn't be able to create a pull request

@AdrienWehrle
Copy link

Very useful, thank you a lot! 👍

@PabloC
Copy link

PabloC commented Aug 18, 2022

Thank you, this is great!

@nestvor
Copy link

nestvor commented Sep 23, 2022

Very nice, thank you!

@stefanomorni
Copy link

Thank you very much for this useful guide.
Is it possible to make a pull request to the remote public repo from your private fork/mirror?
If so, how would you do it?
Thank you
Best regards
Stefano

@alexanderkomarovincode3

It's a useful guide. But it's not up to date for this case: "Mirroring a repository that contains Git Large File Storage objects"
Better to check the GitHub Documentation.

@machist
Copy link

machist commented Jan 15, 2023

Thank you very much for this.
Is it possible to create a mirror of specific branch ?

@marwand
Copy link

marwand commented Jan 22, 2023

Thank you, sir!

@silvaitamar
Copy link

Grato! :)

@hustlijian
Copy link

@iocmet
Copy link

iocmet commented Mar 23, 2023

Thanks

@marchev
Copy link

marchev commented May 10, 2023

Thanks!

@LuWan0122
Copy link

Thanks!

@Ozer0x777
Copy link

Petit filou !

@ofey404
Copy link

ofey404 commented Jun 27, 2023

Great job bro!

@kevherro
Copy link

kevherro commented Aug 1, 2023

Thank you!

@sjohnson-FLL
Copy link

Really helpful, spent hours looking for this exact guide!

@Liuhaai
Copy link

Liuhaai commented Aug 23, 2023

👍

@keriksson-rosenqvist
Copy link

Great tutorial.
Follow up question though. How would I go about making a pull request from my private form to the upstream? Normally when you form there's a button in GitHub to allow you to do this but since this is done manually the GitHub linking isn't there. 🤔

@benjaminorr
Copy link

Thank you

@thomasXwang
Copy link

Thanks 😃

@T0psecurity
Copy link

Thx :)

@DLohn
Copy link

DLohn commented Oct 4, 2023

According to this entry on the GitHub Docs, using GitHub's forking method means that you lose access to your fork if the source repo goes private and you are not authorized to view the now private repo. Making a private fork with this method seems like a no-brainer if you don't use backups and want to access your changes.

@ConfoundingVariables
Copy link

This is immensely useful thanks a lot!!

@ConfoundingVariables
Copy link

This is immensely useful thanks a lot!!

https://github.com/new/import also works! 😅

@maxholloway
Copy link

This is a game changer, thank you so much!

@marcusreaiche
Copy link

Great tutorial! Thanks a lot!

@marcasmed
Copy link

Thanks mate!

@novazur972
Copy link

Thanks too !

@carlos-granados
Copy link

Use this one: https://github.com/new/import

This is the easiest option by far. Just enter the URL of the Github repo you want to replicate and that's it

@MejanH
Copy link

MejanH commented Jan 21, 2024

Use this one: https://github.com/new/import

This is the easiest option by far. Just enter the URL of the Github repo you want to replicate and that's it

Thanks man. the best solution.

@fromSmolsoft
Copy link

fromSmolsoft commented Feb 4, 2024

According to this entry on the GitHub Docs, using GitHub's forking method means that you lose access to your fork if the source repo goes private and you are not authorized to view the now private repo. Making a private fork with this method seems like a no-brainer if you don't use backups and want to access your changes.

I suggest to read that entry again specifically this part here: Changing a public repository to a private repository

...a public repository's forks will remain public in their own separate repository network even after the upstream repository is made private...

@sakibdev
Copy link

Best Github guide I found so far. Straight to the point!

@VictorSCamargo
Copy link

be careful that sometimes, when you make this bare clone, github will loose track of what branch is the default, so you have to configurate it

@wmyers
Copy link

wmyers commented Mar 11, 2024

Use this one: https://github.com/new/import

This is the easiest option by far. Just enter the URL of the Github repo you want to replicate and that's it

Thanks man. the best solution.

Yup this works for me

@krulci
Copy link

krulci commented Apr 16, 2024

For people using Visual Studio 2022:

The repository for the assignment is public and Github does not allow the creation of private forks for public repositories.

For this assignment the commands are:

  1. Create a public fork of the repository easytrace.
    (This is temporary and will be removed.)

  2. Clone your fork using Visual Studio 2022's Clone a repository feature.

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

    git@github.com:<your_username>/easytrace.git
  3. Delete your public fork you made in step 1.

  4. Create a new private repository on Github and name it easytrace.

    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.

  5. In Visual Studio 2022, open Git.

    Git > Open in Command Prompt

  6. Mirror-push your bare clone to your new easytrace repository in the command prompt you just opened in step 5.

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

    git push --mirror git@github.com:<your_username>/easytrace.git

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