Installation d'un serveur Git accessible en HTTPS sous Debian.
Installer apache et git depuis les repos :
apt install git-core apache2 php phpunit unzip php-zip
Créez un dossier pour les projets git (la racine du site web) :
mkdir /var/www/git chown -R www-data:www-data /var/www/git
Activer les modules apache (notamment WebDAV):
a2enmod dav_fs env cgi rewrite alias ssl
Configurer apache. Créer et éditer le fichier /etc/apache2/sites-available/git.domain.local.conf
<VirtualHost *:80> ServerName git.domain.local DocumentRoot "/var/www/git" <Directory "/var/www/git"> Options none AllowOverride AuthConfig #AllowOverride None Order allow,deny Allow from all Require all granted </Directory> SetEnv GIT_PROJECT_ROOT /var/www/git SetEnv GIT_HTTP_EXPORT_ALL ScriptAlias / /usr/lib/git-core/git-http-backend/ <Files "git-http-backend"> AuthType Basic AuthName "Git Access" AuthUserFile "/var/www/.htpasswd" Require valid-user </Files> </VirtualHost>
Activer le site:
a2ensite git.domain.local
Gitlist permet de visionner le dépôt depuis un simple navigateur sans devoir utiliser le client Git. Installation sous Debian.
Aller dans le dossier :
cd /var/www
Récupérer le projet sur GitHub:
git clone https://github.com/klaussilveira/gitlist.git
Installer les dépendances avec Composer :
curl -s http://getcomposer.org/installer | php php composer.phar install
Copiez le fichier config.ini-exemple en config.ini
cp config.ini-example config.ini
Changez le propriétaire du dossier gitlist :
chown -R www-data:www-data .
Configurer apache. Créer et éditer le fichier /etc/apache2/sites-available/gitlist.domain.local.conf
<VirtualHost *:80> ServerName gitlist.domain.local DocumentRoot "/var/www/gitlist" <Directory "/var/www/gitlist"> #Options none AllowOverride All AuthName "GitList" AuthType Basic AuthUserFile "/var/www/.htpasswd" #AllowOverride None Order allow,deny Allow from all Require all granted </Directory> </VirtualHost>
Activer le site :
a2ensite gitlist.domain.local
Editez le fichier config.ini
vim /var/www/gitlist/config.ini
Changez les lignes suivantes :
repositories[] = '/var/www/git/' ; title = "My Git" show_http_remote = true ; http_host = 'git.domain.local' ; use_https = true ; http_url_subdir = '' ; http_user_dynamic = true ;
Se positionner à la racine de Git:
cd /var/www/git
Créer le dossier du projet :
mkdir myproject.git
Initialisez votre projet
cd myproject.git git --bare init git update-server-info chown -R www-data:www-data .
Le projet est disponible via git : https://git.domain.local/myproject.git Sur gitlist le projet ainsi : https://gitlist.domain.local/myproject.git
Définir le nom et email qui apparait dans les commits :
git config --global user.name benoit git config --global user.email benoit@domain.local
Si le dépôt est encore vierge, le premier commit se passe ainsi :
mkdir myproject touch .gitignore git init git add . git commit -m "Initial commit" git remote add origin https://benoit@domain.local/myproject.git git push --set-upstream origin master
Si a tout hasard vous souhaitez changer l'adresse :
git remote set-url origin https://domain.local/myproject.git
Si le projet est existant et contient déjà des commit pour récupérer un projet :
mkdir myproject cd myproject git clone https://benoit@git.domain.local/myproject.git
Si votre dépôt est avec un certificat autosigné :
git -c http.sslVerify=false clone https://benoit@git.domain.local/myproject.git
Il faut systématiquement avoir le reflex le faire pour s'assurer d'avoir une copie à jour du projet.
git pull
Ajouter un fichier :
git add file.php
Pour ajouter tout ce qu'il y a dans le dossier
git add .
Pour retirer un fichier du dépôt :
git rm test.php
Pour retirer un fichier du dépôt :
git mv test.php test_ren.php
Le commit
met à jour votre dépôt local. Quant au push
il poussera vos commit locaux vers le serveur GIT distant.
Mise à jour du dépôt local :
git commit * -m "Commit files"
Mise à jour du dépôt distant :
git push
Vous avez accidentellement supprimé le fichier test.php
? Pour le restaurer :
git checkout HEAD test.php
Ou bien pour restaurer tout :
git checkout HEAD .
Vous souhaitez restaurer un version particulière. Lister l'historique des commit pour commencer :
git log --oneline
Vous aurez une liste des commits. Identifier la version à restaurer (exemple 2c1bc23
) :
f42d29c erreur fichier info.php 2c1bc23 bon fichier info.php 28a9443 autre commit
Pour la restaurer :
git checkout 2c1bc23 info.php git add info.php git commit -m 'restauration info.php de 2c1bc23' git push
Annule toutes les modifications dans les fichiers suivis :
git reset --hard
Supprime tous les fichiers non suivis (-f pour forcer, et -d pour supprimer les répertoires) :
git clean -fd
Checkout de la branche :
git checkout master
Prenons l'exemple ci-dessous:
L'utilisateur “A” a modifier, commit et push le fichier test.php
avec le contenu suivant:
<?php echo "toto\n" ?> toto
L'utilisateur “B”, ne fait pas de git pull
, modifie et commit le même fichier test.php
avec le contenu suivant:
<?php echo "toto\n" ?> titi
L'utilisateur “B” fait git push
et obtient l'erreur suivante :
hint: Updates were rejected because the remote contains work that you do hint: not have locally. This is usually caused by another repository pushing hint: to the same ref. You may want to first integrate the remote changes hint: (e.g., 'git pull ...') before pushing again. hint: See the 'Note about fast-forwards' in 'git push --help' for details.
Celà signifie que sa copie n'est pas à jour. Il doit faire un git pull
. Il obtiendra l'erreur suivante:
remote: Enumerating objects: 5, done. remote: Counting objects: 100% (5/5), done. remote: Compressing objects: 100% (2/2), done. remote: Total 3 (delta 1), reused 0 (delta 0) Unpacking objects: 100% (3/3), done. From https://git.domain.local/myproject 2589a58..8f037d9 master -> origin/master Auto-merging test.php CONFLICT (content): Merge conflict in test.php Automatic merge failed; fix conflicts and then commit the result.
L'utilisateur “B” peut lister les conflits ainsi :
git status
Il peut visionner les différences en éditant le fichier test.php
:
vim test.php
Qui a le contenu suivant :
<?php echo "toto\n" ?> <<<<<<< HEAD titi ======= toto >>>>>>> 8f037d9489ed346ab644e65654ca406c07904dcb
Pour voir le début du conflit de fusion du fichier, recherchez dans le fichier le marqueur de conflit «««<. Lorsque vous ouvrez le fichier dans votre éditeur de texte, vous verrez les modifications de la branche HEAD ou de base après la ligne «««< HEAD
. Ensuite, vous verrez =======
, qui divise vos modifications à partir des modifications dans l'autre branche, suivi de »»»> BRANCH-NAME
. Dans cet exemple, l'utilisateur “B” a écrit titi
dans la branche de base ou HEAD et l'utilisateur “B” a écrit toto
dans la branche de comparaison ou la 8f037d9489ed346ab644e65654ca406c07904dcb
.
A vous de décider ce que vous voulez modifier. Admettons que ce contenu est ce que l'utilisateur B
souhaite garder :
<?php echo "toto\n" ?> titi toto
Il doit maintenant ajouter le fichier :
git add test.php git commit -m "Resolved merge conflict" git push
On garde notre copie :
git checkout --ours .
Marquer tous les fichiers en conflits comme fusionnés :
git add -u
Commit et push :
git commit -m "On impose notre copie" git push
On garde la copie distante :
git checkout --theirs .
Marquer tous les fichiers en conflits comme fusionnés :
git add -u
Commit et push :
git commit -m "Copie distante acceptée" git push
Créer la branch nommée par exemple test1_branch
:
git checkout -b test1_branch
Ajouter les fichiers, vos modifications, les comit etc… Puis pour faire le premier push
sur cette branche :
git push --set-upstream origin test1_branch
Si quelqu'un d'autre doit aussi travailler sur la nouvelle branche. Il peut switcher ainsi :
git checkout test1_branch
Pour revenir à la branch master :
git checkout master
Switcher sur la branche master
:
git checkout master
Fusionner la branche test1_branch
:
git merge test1_branch
Commit de la fusion :
git commit . -m "fusion branch test1_branch avec master"
Puis un push :
git push
Pour récupérer un fichier venant d'une autre branche et l'intégrer à la votre. Ci-dessous, on récupère le fichier hotfix.php
depuis la branche hotfix
:
git checkout test1_branch git checkout origin/hotfix hotfix.php
Récupérer la copie à renommer:
git checkout old_branch_name
Renommer la branch:
git branch -m new_branch_name
Pousser la nouvelle branch:
git push origin -u new_branch_name
Effacer l'ancienne branch:
git push origin --delete old_branch_name
git checkout --orphan NEWBRANCH git rm -rf .
Lister les branchs
git branch