A PCRE internal error occured. This might be caused by a faulty plugin

====== Differences ====== This shows you the differences between two versions of the page.

Link to this comparison view

Next revision
Previous revision
packages:git [2013/12/17 14:54]
admin created
packages:git [2015/05/24 18:45] (current)
admin [Creating Your Local git Copy]
Line 1: Line 1:
 ====== GIT Distributed Version Control ====== ====== GIT Distributed Version Control ======
-If you do not know GIT by now, you've probably been out of 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]].+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>​