Setting up Git offline work via USB memory stick
I have a home laptop and an office desktop computer. When I leave
office, everything is shut down, so there is no way to access the git
repository online. Since I didn’t want to drag my notebook to work
everyday, I got the idea to have a git repository on my USB memory stick.
One of the requirements was that it is a bare repository so it does not take too much space. I had a lot of trouble figuring out this one, and finally I got the right way when I understood how git is meant to be used.
I created a big file on my FAT filesystem, and formatted in in ext2 with something like:
dd if=/dev/null of=/mnt/stick/repos.ext2 bs=1024 count=500000 mkfs.ext2 /mnt/stick/repos.ext2
Then I mounted it and created a bare copy of my repos:
mount -o loop /mnt/stick/repos /mnt/repos cd /mnt/repos git clone /home/milanb/repos repos
When I go home, I repeat the mount on my laptop and pull the changes into local development repository:
mount -o loop /mnt/stick/repos /mnt/repos cd ~/devel/repos git pull /mnt/repos/repos master
After I commit the changes, just push it back to stick:
git push /mnt/repos/repos
Now, the tricky part, when I go
back to the office, I was (stupid) to try to push the changes from
the stick to local repository. There are ways to make this work, but
quite awkward and error prone. Git is not meant to be used that way.
The rules are simple, if you do everything right:
- you should never need to pull/fetch into bare repos
- you should never need to push into non-bare repos
So, what I really needed to do is just to reverse the logic and pull changes from stick into my local repository:
git pull /mnt/repos/repos master
It merges (unless there’s confict) and everything is fine. To prevent from typing all those long paths, you can define aliases (remotes) via git-remote command:
git remote add /mnt/repos/repos stick
And later just do these to pull and push:
git pull stick master git push stick
All that time I used SVN and CVS just got that
centralized way of thinking into me. Finally I’m free ;)
All I can say is: Git simply rocks!