Currently I have 5 projects on my computer which use WinLamb library. So far I’ve been keeping copies of the library directory on each project; these directories are kept in sync with FreeFileSync Portable. Although this approach works, it’s very cumbersome.
Since each project is versioned as a Git repository, and WinLamb itself is a Git repository on GitHub, I started searching for an alternative, and I choose Subtree over Submodule. Following is a summary of the commands I needed to do on my Windows 7 x64, using Git portable v2.13.1:
1. Remote
Add a remote with the path to the repository of the shared project:
git remote add otherproj --no-tags git@github.com:username/otherproj.git
Or if a local project:
git remote add otherproj --no-tags d:/stuff/otherproj
You can view the remotes with:
git remote -v
2. Subtree
Run the Subtree command:
git subtree add --prefix otherproj otherproj master --squash
This will copy the library into the subdirectory and create a commit, with the hash in the message. It’s unnecessary, but you can provide a custom message for the subtree commit:
git subtree add --prefix otherproj otherproj master --squash -m "Subtreeing otherproj."
3. Updating
To update your project with new library code:
git subtree pull --prefix otherproj otherproj master --squash
This leads us to a nice bash function to our ~/.bashrc
file:
function gitsubtreepull { git subtree pull --prefix $1 $1 master --squash; }
Which eases our life when updating our Subtree library:
gitsubtreepull otherproj
So far this approach seems to the better than the old-fashioned directory sync, although it still feels a bit “loose”. I’m still avoiding pushing code from the local repository to the shared library; if I change something, I just copy the code to there, then I update the library repository itself.
Note: beware amending a commit on the remote library. The next time you try to update the dependency, it’s likely to get lost, and you’ll have to remove the subtree and add it again.