====== Git : documentation ====== ===== Gérer un dépôt ===== ==== Qu'est-ce qu'un dépôt ? ==== Le dépôt peut-être : * un répertoire disposant déjà d'un projet * un répertoire vide dédié à un projet futur (...ou proche) * le clone d'un dépôt existant ''git clone'' //A lire ... [[http://git-scm.com/book/fr/Les-bases-de-Git-D%C3%A9marrer-un-d%C3%A9p%C3%B4t-Git|Démarrer un dépôt git]]// ==== git init ==== ''git init'' est utile au démarrage d'un dépôts sans dépôt distant au préalable. Pour initialiser un dépôt sur votre ordinateur, il faut : - se positionner sur le répertoire de dépôt puis clic-droit + ''Git Bash'' - taper la commande $ git init //Cela fait, un sous-répertoire ''.git'' est créé. Il contient tous les fichiers nécessaires à la gestion du dépôt//. === Exemple === //Mise en place d'un dépôt pour le projet ''plum.mvc'':// - Créer un répertoire : ''c:/git/'' - Créer un dépôt : ''c:/git/plum.mvc/'' - Se positionner sur le répertoire ''c:/git/plum.mvc''[à l'aide de l'explorateur windows] - Cli-droit dans la fenêtre de l'explorateur windows : choisir ''Git Bash'' - Initialiser le répertoire : ''git init'' :[**git** ajoute le répertoire caché ''.git''] - Copier le contenu du projet ''plum.mvc'' se trouvant sur un serveur Web - Indexer les fichiers du projet : ''git add .'' [commande équivalente ''git add --all''] - Validation de l'indexage : ''git commit -m 'version 0''' - Poser un tag sur le dernier committ : ''git tag -a version.0 -m 'version.0 exemple non terminée''' Voir http://git-scm.com/book/fr/Les-bases-de-Git-D%C3%A9marrer-un-d%C3%A9p%C3%B4t-Git ===== Dépôt distant ===== La gestion d'un dépôt distant nécessite au préalable * de connaitre l'adresse du dépôt distant ''git''. Par exemple ''git@37.187.66.61:/plummvc.git'' ; * de disposer de droit de lecture et d'écriture ; * de disposer d'une clé ''SSH'' liée à un compte. Dans notre exemple le compte porte le nom de ''git'' L'administrateur du dépôt distant vous demandera votre clé ''SSH'' **publique** afin de mettre à jour les autorisations sur ''git''. Voir : http://git-scm.com/book/fr/Les-bases-de-Git-Travailler-avec-des-d%C3%A9p%C3%B4ts-distants ==== git remote ==== Il est intéressant de mémoriser sous la forme d'alias les adresses internets des dépôts distants. $ git remote add #syntaxe de git remote #exemple $ git remote add plum git@37.187.66.61:/plummvc.git #crée l'alias plum #liste toutes les alias $git remote -v #informations sur un dépôt distant $ git remote show [nom-distant] #la commande $ git remote show origin #informaton sur le dépôt par défaut $ git remote show plum #informaton sur le dépôt plum * Par défaut l'alias d'un dépôt se nomme ''origin'' ==== git clone ==== L'autre façon de démarrer un dépôt gite consiste à cloner un projet existants. //positionnez vous sur le répertoire qui contiendra le dépôts cloné, par exemple ''c:/git/'' // $ git clone #nom distant : une url $ git clone git@37.187.66.61:/plummvc.git #clone le dépôt distant #clone le dépôt distant dans le répertoire c:/git/plummvc/ * Le répertoire ''c:/git/plumvc/'' contient une copie du dépôt distant. ==== git push ==== Pour mettre à jour un dépôt distant on //pousse// le dépôt local avec ''git push'' $ git push #commande git push #exemple $git push git@37.187.66.61:/plummvc.git master #url git@37.187.66.61:/plummvc.git $ git push plum master #alias plum ##toutes les branches $ git push plum --all; * **master** est le nom de la branche principale d'un dépôt https://www.atlassian.com/fr/git/tutorial/remote-repositories#!push ==== git pull ==== ''git pull'' met à jour votre dépôt local à partir du dépôt distant. Récupère par ''fetch'' la copie de la branche active dans le dépôt distant spécifié, et la fusionne immédiatement par ''merge'' dans la copie locale. //Identique à git fetch , suivi de git merge origin/.// $ git pull #git pull #exemple $ git pull plum #met à jour la branche active depuis le dépôt distant plum * La branche active par défaut est ''master''. La branche active change au moment d'un ''git checkout''. Voir : * http://git-scm.com/book/fr/Les-branches-avec-Git-Les-branches-distantes * http://doc.ubuntu-fr.org/git#recuperation_des_changements ==== git fetch ==== Tirer un dépôt distant sans le fusionner avec le dépôt existant sur votre machine. Voir : http://git-scm.com/book/fr/Les-bases-de-Git-Travailler-avec-des-d%C3%A9p%C3%B4ts-distants#R%C3%A9cup%C3%A9rer-et-tirer-depuis-des-d%C3%A9p%C3%B4ts-distants ===== Branches ===== ==== git branch ==== Il est possible de gérer un dépôt sous forme de branche. FIXME la branche principale s'appelle ''master''. #forme générale $git branch [] #liste des branches. * devant la branche active $ git branch -v #Supprimer une branche $ git branch toto -D #supprime la branche toto #Travailler avec une branche $git checkout #permet de travailler avec [devient HEAD] * **On peut créer une branche** à partir d'un tag ou d'un commit ou d'une branche __Exemples :__ $ git branch b1 t1 #création de la branche b1 à partir du tag t1 $ git checkout b1 #positionnement sur la branche b1 #schéma ! ! !(tag t1)---branch t1 ! !(commit) ! (HEAD) * Incorporer et suivre une branche d'un dépôts $ git checkout -b formation.session.A origin/formation.session.1 ou bien depuis ''git 1.6'' $ git checkout --track origin/formation.session.1 * origin : adresse du dépôt distant * formation.session.1 : nom de la branche à suivre ==== git checkout ==== ''git checkout'' permet de désigner une branche comme **active**. //exemple :// $ git checkout ae6788e #se positionne sur le commit commençant par ae6788e $ git checkout master #on revient à l'état du dépôt le plus récent $ git checkout tag1 #branchement vers le tag tag1 $ git branch #liste des branches: * devant la branche active FIXME ''git checkout'' modifie les fichiers du dépôts. Les fichiers sont dans l'état du ''commit'' ou de la branche ou du tag indiqué par ''git checkout''. FIXME Si on veut retrouver l'état de nos fichiers plusieurs ''commit'' en arrière, il existe la version //j'écrase tout et je recommence// avec ''git reset...''. Mais on peut aussi grâce à ''git checkout'' revenir en arrière en gardant ce qui a été fait. ===== git add : git commit===== La commande ''git add'' permet d'indexer les fichiers de votre dépôt dans git. L'indexation sera définitive quand vous aurez réalisé la commande ''git commit''. #Pour connaitre l'état de votre dépôt $ git status #pour savoir où l'on en ait des modifications #indexer tous les fichiers avec les sous-répertoires $ git add * $ git add . $ git add --all $ git add index.php -v #indexer le fichier index.php, option verbose #Valider vos modifications $ git commit -m 'votre message' #validation indexage #Liste des commits $ git log #liste des commits $ git log --pretty=oneline #affiche chaque commit sur une ligne ca82a6dff817ec66f44342007202690a93763949 changed the version number 085bb3bcb608e1e8451d4b2432f8ecbe6306e7e7 removed unnecessary test code a11bef06a3f659402fe7563abf99ad00de2209e6 first commit FIXME ''git commit'' n'intégre que les modifications indexées par ''git add''. Voir : http://git-scm.com/book/fr/Les-bases-de-Git-Enregistrer-des-modifications-dans-le-d%C3%A9p%C3%B4t#Valider-vos-modifications ===== git tag ===== $ git tag montag -m 'mon message' #crée un tag sur le dernier commit $ git tag montag #crée un tag sur le ''commit'' indiqué $ git tag -n #affiche la liste des tags et le message attenant ===== git revert ===== $ git revert b12caf55 #défait les modification du commit b12caf55... ===== git reset ===== $ git reset --hard #remet la branche courante à l'état du commit donné en paramètre. $ git reset --soft #remet la branche courante à l'état du commit mais laisse les différences * l'option **--hard--** efface TOUS les ''commit'' réalisé après '''' Voir : http://gitref.org/index.html ===== Au secours ! ===== ==== Récupération de données ==== Mauvaises manipulations : effacement, ajout intempestif ... Allez ici : http://git-scm.com/book/fr/Les-tripes-de-Git-Maintenance-et-r%C3%A9cup%C3%A9ration-de-donn%C3%A9es ssh ===== SSH ===== Cette partie est consacrée à l'usage du protocole ''SSH'' pour la mise à jour de **dépôts distants**. Le protocole ''SSH'' est le protocole de communication privilégié par **git** pour le gestion de dépôt distant. Pour la sécurité des échanges il est nécessaire que __chaque intervenant__ sur un dépôt dispose **d'une clé personnelle**. * une clé publique qui sera sur le serveur du dépôt * une clé privée __qui ne devra être communiqué à personne__ ====ssh-keygen==== La commande ''ssh-keygen'' crée le répertoire ''.ssh''. Le répertoire ''.ssh'' contient * la clé privée : **id_rsa** est le fichier contenant la **clé privée** * la clé publique : **id_rsa.pub** est le fichier contenant la **clé publique** __Pour approfondir :__ * https://help.github.com/articles/generating-ssh-keys * https://gist.github.com/jexchan/2351996 * https://help.github.com/articles/working-with-ssh-key-passphrases ==== Générer une clé SSH ==== Avec l'installation de ''git pour Windows'' vous disposez de la commandes ''ssh-keygen''. Avec Windows les données ''SSH'' sont mémorisées dans c:/USERS/nomUtilisateur/.ssh/ === Démarche === Cette façon de faire est celle préconisée par [[https://help.github.com/articles/generating-ssh-keys|github]] $ ssh-keygen -C "votreAdresseMail" Enter file in which to save the key (/c/Users/nomUtilisateur/.ssh/id_rsa): Enter passphrase (empty for no passphrase): Enter same passphrase again: Your identification has been saved in /c/Users/nomUtilisateur/.ssh/id_rsa. Your public key has been saved in /c/Users/nomUtilisateur/.ssh/id_rsa.pub. The key fingerprint is: d0:71:98:a3:16:55:88:8b:d5:bd:e2:8a:0a:41:68:d2 nomUtilisateur@WIN-JQFKJHT191F * **ssh-keygen** : Permet de générer le calcul de la clé privée et de la clé publique depuis ''Git Bash'' * **Enter file...** : Choisir le répertoire contenant les ''clés ssh'' * **PassPhrase** : Choisir une phrase pour le mot de passe Votre clé privée doit être tenue **secrète**. Il est recommandé de la protéger par une phrase servant de mot de passe. ==== Git et SSH ==== Par défaut ''Git'' recherche votre clé privée dans le répertoire ''c:/users/nomUtilusateur/.ssh/''. * A chaque accès au dépôt distant la clé privé sera fourni par **Git**. === PassPhrase === L'utilisation de la ''passphrase'' est demandée à chaque fois que vous voulez accéder au dépôt central. ==.profile== Pour éviter de retaper la ''passphrase'' vous devez mettre le fichier ''.profile'' dans le répertoire ''c:/users/nomUtilisateur/''. * Copier et coller les lignes suivantes dans le fichier ''c:/USERS/nomUtilisateur/.profile''. Utiliser ''NotePad++'' pour pouvoir mémoriser correctement votre fichier. # Note: ~/.ssh/environment should not be used, as it # already has a different purpose in SSH. env=~/.ssh/agent.env # Note: Don't bother checking SSH_AGENT_PID. It's not used # by SSH itself, and it might even be incorrect # (for example, when using agent-forwarding over SSH). agent_is_running() { if [ "$SSH_AUTH_SOCK" ]; then # ssh-add returns: # 0 = agent running, has keys # 1 = agent running, no keys # 2 = agent not running # if your keys are not stored in ~/.ssh/id_rsa.pub or ~/.ssh/id_dsa.pub, you'll need # to paste the proper path after ssh-add ssh-add -l >/dev/null 2>&1 || [ $? -eq 1 ] else false fi } agent_has_keys() { # if your keys are not stored in ~/.ssh/id_rsa.pub or ~/.ssh/id_dsa.pub, you'll need # to paste the proper path after ssh-add ssh-add -l >/dev/null 2>&1 } agent_load_env() { . "$env" >/dev/null } agent_start() { (umask 077; ssh-agent >"$env") . "$env" >/dev/null } if ! agent_is_running; then agent_load_env fi # if your keys are not stored in ~/.ssh/id_rsa.pub or ~/.ssh/id_dsa.pub, you'll need # to paste the proper path after ssh-add if ! agent_is_running; then agent_start ssh-add elif ! agent_has_keys; then ssh-add fi unset env Au démarrage de ''Git Bash'' le fichier ''.profile'' est exécuté. ''ssh-agent'' vous demande votre phrase et la conserve la durée de votre connexion. == ssh-add == $ ssh-add permet de demander la mémorisation de la ''passphrase'' pour l'accès à votre clé privée ''SSH''. Cela évite de la resaisir à chaque ''push'' ou ''pull''. Voir : https://help.github.com/articles/working-with-ssh-key-passphrases ===== Liens ===== * http://git-scm.com/book/fr/D%C3%A9marrage-rapide * http://git-scm.com/ * https://help.github.com/ * https://help.github.com/articles/duplicating-a-repository * https://gist.github.com/jexchan/2351996 ===== bad file number ===== CETTE PARTIE N'EST PLUS D'ACTUALITE MAIS SUBSISTE UNIQUEMENT POUR INFORMATION L'erreur suivante est souvent du à un proxy : ssh: connect to host github.com port 22: Bad file number fatal: Could not read from remote repository. Please make sure you have the correct access rights and the repository exists. Au lycée il n'est pas possible d'utiliser ''ssh'' en natif pour les mises à jour vers ''github''. La solution consiste à ajouter un fichier ''config''. #~/.ssh/config Host github.com Hostname ssh.github.com Port 443 //Voir :// * http://www.git-attitude.fr/2010/09/13/comprendre-et-maitriser-les-cles-ssh/ * https://help.github.com/articles/using-ssh-over-the-https-port * https://help.github.com/articles/error-bad-file-number