====== GIT Distributed Version Control ====== If you do not know GIT by now, you've probably been away from the software development ecosystem for a while... or you're very new to it. If that is the case, it is warmly recommended that you learn more about this great tool for version control in distributed environments. You can get a quick impression of what GIT is by reading this [[http://git-scm.com/about|introduction on the official GIT website]]. ---- ==== Installation of the Git Package (client) ==== ---- For comprehensive information regarding git, please refer to the [[http://git-scm.com/documentation|official git documentation]]. As long as you satisfy yourself with the latest Git release available from the debian repos you could simply issue the following command to install it on your system: <code> sudo apt-get update sudo apt-get install git </code> In case you'd like to benefit from the very latest additions made to Git, you should then [[http://git-scm.com/book/en/Getting-Started-Installing-Git|install Git from sources]] ---- ==== Server Side Install ==== ---- <code> > sudo apt-get update > sudo apt-get install git </code> === Create git user and repository === <code> > sudo adduser git Adding user `git' ... Adding new group `git' (1001) ... Adding new user `git' (1001) with group `git' ... Creating home directory `/home/git' ... Copying files from `/etc/skel' ... Enter new UNIX password: Retype new UNIX password: passwd: password updated successfully Changing the user information for git Enter the new value, or press ENTER for the default Full Name []: Room Number []: Work Phone []: Home Phone []: Other []: Is the information correct? [Y/n] Y </code> Create the main repository for git projects: <code> > su git > cd $HOME > mkdir <git-projects> > chmod 2775 <git-projects> </code> Change the umask for users having **/home/git** as home: <code> > su git > nano .profile CHANGE: # the default umask is set in /etc/profile; for setting the umask # for ssh logins, install and configure the libpam-umask package. umask 0002 </code> The umask controls the default file creation permissions, 0002 means files will have 664 and directories 775. Setting this, by editing the umask line in **/etc/profile** in our case, means files created by one user will be writable by other users in the git group without needing to chmod them. This solution was inspired by [[http://serverfault.com/questions/6895/whats-the-best-way-of-handling-permissions-for-apache2s-user-www-data-in-var|this post on serverfault.com]]. === Add shell users === Create gitusers, members of the git group and having **/home/git** as home <code> > sudo adduser <gituser> > sudo passwd <gituser> > sudo usermod -a -G git <gituser> > sudo usermod -d /home/git <gituser> </code> === Using RSA keys for login === To avoid having to enter a password each time the <gituser> logs in to the server, we'll register it's public RSA id key into the **.ssh/authorized_keys** file: First you'll have to receive the public from each one of your intended users. The public key of a user generally resides in a pair of files, under your **$HOME/.ssh** directory, named something and something.pub, where the something is usually id_dsa or id_rsa. The .pub file is your public key, and the other file is your private key. If you don’t have these files (or you don’t even have a .ssh directory), you can create them by running a program called ssh-keygen, which is provided with the SSH package on Linux/Mac systems and comes with the MSysGit package on Windows: To create a new pair of keys (on your local machine): <code> > mkdir $HOME/.ssh > cd $HOME/.ssh > ssh-keygen </code> Then copy the content of the **$HOME/.ssh/id_rsa.pub** file to the **/home/git/.ssh/authorized_keys** file on the server. The user should now be able to login to the server using ssh without having to enter a password. ---- ==== Creating a Shared git Project Repository ==== ---- Login to the server and init a bare repository: <code> > ssh <gituser>@my.server.tld > cd /home/git/<git-projects> > mkdir <project-name.git> > cd <project-name.git> > git init --bare </code> === Create hooks === git automates execution of shell scripts before or after execution of specified operations, have a look inside your project's "bare" git repository, and look at what's inside the <project-name.git>/hooks directory... An example of what can be achieved using these scripts is to checkout the latest committed version to a specific directory right after each commit: <code> > nano hooks/post-receive WRITE: #!/bin/sh GIT_WORK_TREE=/var/www/www.mysite.com/web git checkout -f > chmod +x hooks/post-receive </code> ---- ==== Creating Your Local git Copy ==== ---- <code> > cd /home/<username>/path/to/project > git init > git remote add <staging> <gituser>@my.server.tld:/home/git/<git-projects>/<project-name.git> > git add <file1> <file2> <dir/*> > git commit -m <"Initial commit"> > git push <staging> +master:refs/heads/master </code> To update an existing remote: <code> > git remote set-url <staging> <gituser>@my.newserver.tld:/home/git/<git-projects>/<project-name.git> </code> ---- ==== Useful Git Commands ==== ---- It isn't in the scope of this article to help you learn Git, although here are a few commands that prove themselves useful in the course of my development experience <wrap todo>TO BE COMPLETED</wrap>