~ o ~
For an open-source, world-class network protocol analyser.
Diceless role-playing in four-star luxury.
~ o ~
There is a project I want to work with on github, but I want my own repository where I can work on my own stuff, but still fetch changes from the main project. I don't want to commit my changes to the main project, but I want to allow them to pull some of my commits. I would have thought that was a common requirement, but it turns out to be mildly complex to achieve.
First clone the main project on Github using the web interface. In this example the main project is tipam/pi3d, and my clone is rurwin/pi3d.
Next install git-core on your local PC and clone the main project there too.
pi@raspberrypi ~ $ git clone https://github.com/tipam/pi3d.git Cloning into 'pi3d'... remote: Counting objects: 4067, done. remote: Compressing objects: 100% (1556/1556), done. remote: Total 4067 (delta 2773), reused 3794 (delta 2505) Receiving objects: 100% (4067/4067), 71.48 MiB | 33 KiB/s, done. Resolving deltas: 100% (2773/2773), done. Checking out files: 100% (358/358), done.
Now we create a remote called publish to allow us to push our commits up to our github repository.
pi@raspberrypi ~ $ cd pi3d pi@raspberrypi ~/pi3d $ nano .git/remotes/publish URL: https://github.com/rurwin/pi3d Push: +master:master Push: +integration:integration
There's one of those "Push" lines for each branch in the main project (that we are interested in). The "+" tells it to always overwrite, so no matter what we do to our local repository it will be mirrored on our github repository.
As yet we have only created the master local branch, so we checkout the other branch (from the main repository) and create it locally:
pi@raspberrypi ~/pi3d $ git checkout -b integration origin/integration Branch integration set up to track remote branch integration from origin. Switched to a new branch 'integration'
We now have access to both branches on the main project. Let's test that:
pi@raspberrypi ~/pi3d $ git checkout master Switched to branch 'master' pi@raspberrypi ~/pi3d $ ls Amazing.py Earth.py MarsStation.py RobotWalkabout.py BouncingBalls.py EnvironmentCube.py models screenshots BuckfastAbbey.py fonts pi3d.py Shapes.py ChangeLog.txt ForestWalk.py Pong.py textures Clouds3d.py HelloWorldWindow.py Raspberry_Rain.py TigerTank.py CollisionBalls.py images readme.html TriceratopsModel.py ConferenceHall.py include ReadMe.md pi@raspberrypi ~/pi3d $ git checkout integration Switched to branch 'integration' pi@raspberrypi ~/pi3d $ ls ChangeLog.txt echomesh __init__.py pi3d screenshots Test.py Demo.py fonts LICENSE readme.html shaders textures demos images models ReadMe.md TestKeyboard.py
Finally we publish the contents of our local repository to our github repository:
pi@raspberrypi ~/pi3d $ git push publish Username for 'https://github.com': rurwin Password for 'https://email@example.com': Counting objects: 141, done. Compressing objects: 100% (72/72), done. Writing objects: 100% (110/110), 5.96 MiB | 118 KiB/s, done. Total 110 (delta 47), reused 100 (delta 38) To https://github.com/rurwin/pi3d a49ba04..c2127ff integration -> integration + 568f302...1061894 master -> master (forced update)
And just to prove it, here's my github network with all the commits in it and none anywhere else, proving my github repository is a full and correct copy of the latest main project.
So now we can keep our local repository up-to-date with the main project repository but we can publish our commits to github where we can raise a pull request to the main project.
My thanks to Jeff King for the huge help in constructing this. Any mistakes or misinterpretations are all mine.