``` ./thesis ├── docker-compose.yaml ├── micrsoserviceX ├── micrsoserviceY ├── memory-engine ``` # Subtree workflows Adapted from [here](https://medium.com/@v/git-subtrees-a-tutorial-6ff568381844). Below is an executive summary for the use case of a university collaborative thesis project. We have the `thesis` folder and some other, subproject folder (the `memory-engine` in this example). We want the `thesis` to be a "main" repository, such that on a new machine, just pulling it is enough to get us started. We also want to make it easy to make changes either to `memory-engine/` code, or to code in the `thesis/` or to both, without having to bump versions/commits every time we push to `memory-engiine`. We could have used `git submodules` but it's so much pain (really). ## Set up a new subtree * In `thesis/`: `git remote add memory-engine-origin git@github.com:warreee/memory-engine.git` * add the subtree (this will clone the master of the `memory-engine` repo and configre the thesis) repo. `git subtree add --prefix=memory-engine/ memory-engine-origin master` ## Changing `memory-engine` from within the `thesis` We have opened the thesis repo in, say, PyCharm, we make a change in the 'memory-engine' folder and just want to publish our changes without having to push first to the `memory-engine` repo and then pulling from `thesis`. * e.g. if we are in `thesis/`, we can make changes to the memory-engine `touch ./memory-engine/boo` * and then push the changes to the `thesis` repo `git commit -am "added boo"` `git push origin master` (origin here is the thesis origin) In GitHub of `thesis`, the commit would appear. Nothing special, but still useful because we didn't have to bump versions anywhere. ## Changing files from both repos Example - change files in both the `thesis` and the `memory-engine` folders: * make the changes `georgi@georgi-laptop:~/Projects/thesis/memory-engine(master)$ echo "boo :)" >> README.md` `georgi@georgi-laptop:~/Projects/thesis(master)$ echo "testing" >> README.md` * make a commit and push it to the `thesis` repo `git commit -am "made a commit to both repos"` `git push origin master` * Push to the `memory-engine` repo `georgi@georgi-laptop:~/Projects/thesis(master)$ git subtree push --prefix memory-engine memory-engine-origin master` * If we open the GitHub of `thesis` - we will see the commit, with both files changed. If we open the GitHub of `memory-engine`, only the memory-engine/README.md will be in the commit. Voila