Fri 28 Apr 2017 09:36:02 AM -03

Git research and development.

Barebones shared git repositories

No gitolite, gitosis, gitlab or whatever involded. Only OpenSSH and git is needed.

Basic config

If needed, create a host instance for your git server at your ~/.ssh/config:

Host git.project.org gitserver
  HostName git.project.org

Now make sure you can log into the server using key-based auth.

Server config

sudo apt install git
sudo adduser git --home /var/git
sudo mkdir              /var/git/repositories
sudo chown git.         /var/git/repositories
sudo chmod 775          /var/git/repositories
sudo usermod -a -G git `whoami` # add yourself into the git group

Creating a repository

At your computer:

repo="name-your-project-here"
mkdir $repo
cd $repo
git init
git remote add origin ssh://gitserver/var/git/repositories/$repo.git

Then do your regular stuff: create files, commit stuff, etc:

touch test
git add .
git commit -m "Initial import"

Copy a bare git repo to the server

cd ..
git clone --bare $repo $repo.git
scp -r $repo.git gitserver:/var/git/repositories/$repo.git

Making the repository shareable

In the server:

sudo chgrp -R git /var/git/repositories/$repo.git
sudo chmod 775    /var/git/repositories/$repo.git

find /var/git/repositories/$repo.git/ -type f -exec sudo chmod 664 {} \;
find /var/git/repositories/$repo.git/ -type d -exec sudo chmod 775 {} \;

Now make sure that the repository configuration has the following option at the core section:

sharedRepository = group

You can edit /var/git/repositories/$repo.git/config to add this config or just run the following commands:

git -C /var/git/repositories/$repo.git config core.sharedRepository group

Daily workflow

From now on, you can work at your computer's local $repo as usual:

cd $repo
git pull
touch another-test
git add .
git commit -m "Adds another-test"
git push # this sends changes back to your git server

Adding more users into the game

You can add existing users to edit the repository given that:

  • They have accounts in the system.
  • They are added into the git group.

If they also use key-based auth they can seamlessly contribute to your repository as if you were using a more complex repository manager like gitolite or a service like gitlab.

You can even try to implement some more complex access control by using different groups for each project so you're not bound to the git group.

References

Push to deploy

  • https://www.digitalocean.com/community/tutorials/how-to-set-up-automatic-deployment-with-git-with-a-vps
  • https://github.com/blog/1994-git-2-4-atomic-pushes-push-to-deploy-and-more
  • http://krisjordan.com/essays/setting-up-push-to-deploy-with-git
  • https://petecoop.co.uk/blog/git-2-3-push-deploy
  • http://superuser.com/questions/230694/how-can-i-push-a-git-repository-to-a-folder-over-ssh
  • https://devcenter.heroku.com/articles/git
  • https://github.com/blog/1957-git-2-3-has-been-released (push-to-deploy)
  • https://github.com/git/git/blob/v2.3.0/Documentation/config.txt#L2155
  • http://stackoverflow.com/questions/1764380/push-to-a-non-bare-git-repository
  • http://bitflop.com/tutorials/git-bare-vs-non-bare-repositories.html

Further development