Cette page est en lecture seule. Vous pouvez afficher le texte source, mais ne pourrez pas le modifier. Contactez votre administrateur si vous pensez qu'il s'agit d'une erreur. ====== Git ====== ===== Un serveur Git ===== ==== Installation ==== aptitude install git-core ==== Création/Initialisation d'un dépôt ==== Il y a certainement mieux pour initialiser mais bon. Voilà une méthode de A-Z d'initialisation d'un nouveau repos : * En local sur un client : mkdir mon_projet cd mon_projet git init * Ensuite on y met nos premiers fichiers : touch README * On fait notre premier ajout/commit : git add . git commit * Ensuite on le clone au format //bare// : cd .. git clone --bare monprojet monprojet.git * Ensuite on met notre clone sur un serveur public : scp -r monprojet.git/ user@srv:public_git/monprojet.git/ * On peut ensuite faire un clone du projet en local : git clone ssh://user@srv/home/user/public_git/monprojet.git monprojet_local * On peut maintenant utiliser ce clone normalement : add, commit, push, ... ==== Mise en place d'un accès via git-daemon ==== * Éditer le fichier ///etc/inetd.conf// et ajouter la ligne suivante : git stream tcp4 nowait root /usr/bin/git-daemon -- --inetd --syslog --verbose --export-all --base-path=[BASE] --timeout=60 --user-path=public_git * **[BASE]** : le chemin de base de l'accès = la racine des urls d'accès * Exemple: * URL : git://srv/toto * //[BASE]// : ///home// * Alors la racine du repos sera ///home/toto// * **--user-path** : Le dossier dans les homes des utilisateurs qui seront partagé grâce à une URL en **~user** (ici //~toto// = //$HOME/public_git//) * Restart openbsd-inetd : ///etc/init.d/openbsd-inetd restart// === Avec git-daemon-run === * Installer le paquet //git-daemon-run// : <code>apt-get install git-daemon-run</code> * Editer le fichier de lancement du daemon : ///etc/sv/git-daemon/run// * Exemple d'une configuration avec un utilisateur //git// : <code>#!/bin/sh exec 2>&1 echo 'git-daemon starting.' exec chpst -ugit \ "$(git --exec-path)"/git-daemon --verbose --reuseaddr --export-all --enable=receive-pack \ --base-path=/home/git /home/git</code> Pour contrôler le service : * Démarrage : <code>sv start git-daemon</code> * Arrêt : <code>sv stop git-daemon</code> * Redémarrage : <code>sv restart git-daemon</code> Suivie des logs dans le fichier : ///var/log/git-daemon/current// ===== Accès au serveur ===== ==== Renseigner son profil git ==== <code bash>git config --global user.email "user@email.com" git config --global user.name "User Name"</code> **Remarque : ** Les infos sont stockées dans //˜/.gitconfig// ==== Clone ==== * Via protocole Git : <code bash>git clone git://srv/~toto/monprojet monprojet_local</code> * Via SSH : <code bash>git clone ssh://toto@srv/home/toto/public_git/monprojet monprojet_local</code> **monprojet_local** : Chemin local du repo ==== Track d'une branche distante ==== <code bash>git checkout -b prod origin/prod</code> ==== Utilisation courante ==== * Connaitre le statut des fichiers modifié/ajouté/supprimé : <code bash>git status</code> * Ajouter un nouveau fichier : <code bash>git add file1 file2 ...</code> * Supprimer un fichier : <code bash>git rm file1</code> * Bouger/renomer un fichier : <code bash>git mv file-old file-new</code> * Commiter (local) : <code bash>git commit [-a]</code> * Envoyer ses commits sur le serveur remote : <code bash>git push</code> * Récupérer les derniers commits des autres dans son repos : <code bash>git pull</code> * Modifier le dernier commit (non propagé) : - Faire les modifications souhaitées et les ajouter avec la commande //git add// - Commiter en modifiant le dernier commit : <code bash>git commit --amend</code> * Modifier un commit spécifique (non propagé) : * **Via //"fixup"// :** - commiter vos modifications à fusionner dans le précédent commit via la commande suivante en indiquant l'ID du commit à modifier <code bash>git commit --fixup=38b184620e5d0da47de4c6d7ed81e807af479fb2</code> - exécuter ensuite la commande suivante en indiquant l'ID du commit à modifier (attention au ''^'' à la fin de l'ID du commit) :<code bash>git rebase --interactive '38b184620e5d0da47de4c6d7ed81e807af479fb2^' --autostash --autosquash</code> * **Via une édition manuelle :** - exécuter la commande suivante en indiquant l'ID du commit à modifier (attention au ''^'' à la fin de l'ID du commit) : <code bash>git rebase --interactive '38b184620e5d0da47de4c6d7ed81e807af479fb2^' --autostash</code> - Dans l'éditeur s'ouvrant, repérer la ligne spécifiant le commit à modifier et remplacer ''pick'' par ''edit''. Enregistrer et quitter l'éditeur. - Effectuer la modification souhaitez puis commiter à l'aide de la commande suivante : <code bash>git commit --all --amend --no-edit</code> - Vous pouvez constater que votre commit à bien été modifié à l'aide de la commande ''git show'' - Pour revenir à votre //working tree// intégrant vos commits suivants, exécuter la commande suivante : <code bash>git rebase --continue</code> * Supprimer le dernier commit (en conservant les modifications) : <code bash>git reset HEAD^</code> * Supprimer le dernier commit (en **suppriant** les modifications) : <code bash>git reset --hard HEAD^</code> **Remarque :** C'est la même chose qu'un //git fetch// puis un //git merge// * Voir la liste des commits : <code bash>git log</code> **Remarque : ** On peut rajouter un nom de fichier pour voir seulement les commits impactant ce fichier. * Générer des patchs à partir de vos commits : * repérer dans ''git log'' l'ID du commit précédent le(s) commit(s) pour lesquel vous souhaitez générer les patchs * lancer la commande suivante : <code bash>git format-patch [ID commit précédent]</code> * Appliquer un patch sans comiter : <code bash>git apply [patch]</code> * Appliquer un patch et le comiter avec les informations fournis dans celui-ci : <code bash>git am --signoff -k < [patch]</code> **Remarques :** * le paramètre ''--signoff'' permet d'ajouter une ligne //Signed-off-by:// dans le message du commit avec vos informations. * le paramètre ''-k'' permet de conserver les éventuels flag présent dans le message de commit (infos entre crochets)