Skip to content

Instantly share code, notes, and snippets.

@jorotenev
Last active July 26, 2019 09:37
Show Gist options
  • Save jorotenev/76787a53107e971a7c75bcfaee64cf15 to your computer and use it in GitHub Desktop.
Save jorotenev/76787a53107e971a7c75bcfaee64cf15 to your computer and use it in GitHub Desktop.
Workflow for git subtree
./thesis
├── docker-compose.yaml
├── micrsoserviceX
├── micrsoserviceY
├── memory-engine

Subtree workflows

Adapted from here. 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

Change the branch of memory-engine

http://stackoverflow.com/questions/18536279/git-subtree-possible-to-change-subtree-branch-path-in-a-forked-repository

  • push the branch to the memory-engine repo
  • In thesis
    rm -rf memory-engine
  • Commit
  • georgi@georgi-laptop:~/Projects/thesis(master)$ git subtree add --prefix=memory-engine/ memory-engine-origin <memory-engine-branch-we-want>
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment