Outils pour utilisateurs

Outils du site


linux:memo_git

Différences

Ci-dessous, les différences entre deux révisions de la page.

Lien vers cette vue comparative

Les deux révisions précédentesRévision précédente
Prochaine révision
Révision précédente
linux:memo_git [29/04/2010 14:17] daniellinux:memo_git [21/12/2012 11:23] (Version actuelle) – aj qq Commandes courantes daniel
Ligne 2: Ligne 2:
 Git est un gestionnaire de versions (comme svn, cvs ou d'autres) décentralisé. Git est un gestionnaire de versions (comme svn, cvs ou d'autres) décentralisé.
  
-Bonne doc en français sur http://alexgirard.com/git-book/index.html+Un bon résumé de git et de son fonctionnement sur http://www.siteduzero.com/tutoriel-3-254198-gerez-vos-codes-source-avec-git.html
  
-Maisparfois, la centralisation s'avère pratique, et c'est aussi possible.+Avant de se lanceril vaut mieux lire au moins les chapitres 1 et 2 du livre pro git http://git-scm.com/book/fr (ou un autre)pour bien comprendre les concepts de base (git fonctionne sur des snapshots de l'état du dépôt, faut d'abord cerner ce qu'est un blob et un objet commit), pour éviter ensuite de se retrouver dans une situation où l'on croyait savoir mais on y comprend plus rien. Il faut faire la distinction entre 
 +  * workspace : le répertoire courant, changer de branche revient à faire un échange de snapshots de ce répertoire (ou d'une partie), pas à en changer (par opposition à svn où on passe de trunk à branche/ma_branche) 
 +  * index (ou stage) : la liste de ce qui se passera au prochain commit. Contrairement à svn on peut faire un commit de plusieurs fichiers, mais pas forcément dans leur état courant, on commit l'index, donc il faut faire un add (passer dans l'index) puis commit, même si souvent on fait un "commit -a" qui revient à ajouter à l'index tous les fichiers modifiés puis à faire le commit. Pour une utilisation basique, i.e. si on ne fait que des "commit -a" sans add préalable, on peut oublier cet état, mais attention si vous faite un add puis modifier le fichier, un git diff donnera alors la différence depuis le add, pas depuis le dernier commit (pour ça faut préciser "git diff HEAD"). Ne pas oublier : "un commit est un pointeur vers l'instantané du contenu qui a été indexé" (un snapshot de ce qu'on a mis en stage|index). **Rq** c'est ce que j'ai compris de la littérature mais chez mois un ''commit -m "commentaire" fichier'' envoie le fichier dans son état actuel et pas dans l'état du dernier add :-S 
 +  * local repository : la base git locale (qui contient tout l'historique du dépôt) 
 +  * remote repository : un dépôt distant, il peut y en avoir plein, et on peut avoir des branches qui pointent vers différents dépôt. 
 +  * stash : ça on peut s'en passer dans un 1er temps, même si c'est pratique. C'est un espace "tampon", pour y mettre ses modifs locales que l'on ne veut pas encore passer en commit (cf [[http://git-scm.com/book/fr/Utilitaires-Git-La-remise|la remise]] pour des exemples). Indispensable avant de changer de branche par ex. 
 + 
 +Résumé des commandes git 
 +  * graphique interactif efficace : http://ndpsoftware.com/git-cheatsheet.html 
 +  * http://jonas.nitro.dk/git/quick-reference.html 
 +  * http://cheat.errtheblog.com/s/git 
 +  * https://na1.salesforce.com/help/doc/en/salesforce_git_developer_cheatsheet.pdf 
 +  * chez [[http://doc.fedora-fr.org/wiki/Gestion_et_contr%C3%B4le_de_versions_avec_Git|fedora]] 
 + 
 +La référence (les pages man) : http://git-scm.com/docs 
 + 
 +Il y a aussi le  [[http://www.alexgirard.com/|git community book]] en fr, avec son [[http://www.alexgirard.com/git-book/book.pdf|pdf]] 
 + 
 +Des alias intéressant sur https://git.wiki.kernel.org/index.php/Aliases 
 + 
 +La page de doc du plugin netbeans http://netbeans.org/kb/docs/ide/git.html 
 + 
 +Tip & tricks 
 +  * http://mislav.uniqpath.com/2010/07/git-tips/ 
 + 
 +===== Commandes courantes ===== 
 +  * Modifier le dernier message de commit ''git commit --amend -m "New commit message"'' ([[http://stackoverflow.com/a/179147|src]]) 
 +  * voir les serveurs distants (ajouter -v pour avoir les urls) ''git remote'' 
 +  * editer la conf par defaut ''git config -e'' 
 + 
 +===== Dépôt centralisateur ===== 
 + 
 +Le décentralisé c'est très bien, mais parfois un dépôt qui centralise est bien pratique, et c'est aussi possible.
  
 Cf http://scie.nti.st/2007/11/14/hosting-git-repositories-the-easy-and-secure-way,  Cf http://scie.nti.st/2007/11/14/hosting-git-repositories-the-easy-and-secure-way, 
Ligne 11: Ligne 43:
 Ensuite, quelques liens utiles Ensuite, quelques liens utiles
   * http://linux-attitude.fr/post/Git-%C3%A0-tous-les-%C3%A9tages   * http://linux-attitude.fr/post/Git-%C3%A0-tous-les-%C3%A9tages
-  * http://jonas.nitro.dk/git/quick-reference.html 
-  * http://cheat.errtheblog.com/s/git 
   * http://alexgirard.com/git-book/3_workflows_distribu%25C3%25A9s.html   * http://alexgirard.com/git-book/3_workflows_distribu%25C3%25A9s.html
   * http://xhfamily.com/x/notes/20080819_git-process.html   * http://xhfamily.com/x/notes/20080819_git-process.html
Ligne 20: Ligne 50:
   * http://scie.nti.st/2007/11/14/hosting-git-repositories-the-easy-and-secure-way   * http://scie.nti.st/2007/11/14/hosting-git-repositories-the-easy-and-secure-way
  
-===== Opérations courantes ===== +Ce qui suit est assez ancien et à prendre avec des pincettes (m'étonne qu'il n'y ai pas --bare pour la création du dépôt centralisateur).
-http://www.kernel.org/pub/software/scm/git/docs/user-manual.html#git-quick-start +
-<code bash> +
-# transformer le dossier courant en projet git +
-git init +
-# ajouter tous ses fichiers au projet (ou bien préciser les fichiers à ajouter) +
-git add . +
-# ajouter un alias pour un projet sur un serveur distant +
-git remote add alias_de_ce_projet_sur_ce_serveur user@<server>:path/2/le_projet.git +
-# y envoyer les fichiers +
-git push alias_de_ce_projet_sur_ce_serveur la_branche # "master" pour la branche principale +
- +
-# commit d`un fichier (localement) +
-git commit -m 'message de commitle_fichier +
-# commit de tous les fichiers (localement) +
-git commit -m 'message de commit' -+
-# envoi de tous les derniers commit (depuis le dernier pushsur le serveur +
-git push +
-</code> +
  
 ==== Ajout d'un dépôt local sur le serveur ==== ==== Ajout d'un dépôt local sur le serveur ====
Ligne 74: Ligne 85:
 </code> </code>
  
-===== Script de démarrage ===== 
-Mon script d'init /etc/init.d/git-daemon (basé sur /etc/init.d/skeleton) 
-<code bash> 
-#!/bin/sh 
-### BEGIN INIT INFO 
-# Provides:          git-daemon 
-# Required-Start:    $networking 
-# Required-Stop:     $networking 
-# Default-Start:     2 3 4 5 
-# Default-Stop:      0 1 6 
-# Short-Description: start/stop git-daemon to handle git protocol  
-# Description:       The daemon is launched under the git user 
-### END INIT INFO 
  
-# Author: Daniel Caillibaud <daniel@edulibre.org> 
  
-PATH=/sbin:/usr/sbin:/bin:/usr/bin +==== Script de démarrage ==== 
-DESC="git-daemon (which handles git protocol on 9418 port)" +Avant le paquet git-daemon-run, il fallait créer un script de démarrage (cf historique de cette page), mais maintenant c'est dans debian : 
-NAME=git-daemon +<code bash> 
-DAEMON=/usr/bin/$NAME +aptitude install git-daemon-run 
-# DAEMON_ARGS later (after default conf load) +ln -s /usr/bin/sv /etc/init.d/git-daemon 
-PIDFILE=/var/run/$NAME.pid +# et on va modifier /etc/sv/git-daemon/run pour préciser le --base-path 
-SCRIPTNAME=/etc/init.d/$NAME+</code>
  
-# start-stop-daemon options +===== Exemples ===== 
-SSD_OPTIONS='--chuid git:git --nicelevel 5 --background' # git-daemon doesn't detach himself+Ci dessous qq démos, pour vous faire une idée.
  
-Exit if the package is not installed +Les ligne qui commencent par "#> correspondent à la sortie de la commande précédente, pour permettre de copier/coller tout en console sans avoir de tri à faire
-[ ! -x "$DAEMON" ] && log_daemon_msg "$DAEMON doesn't exist" && echo "$DAEMON doesn't exist" > 2 && exit 0+
  
-# Read configuration variable file if it is present 
-[ -r /etc/default/$NAME ] && . /etc/default/$NAME 
  
-DAEMON_ARGS="--base-path=$GIT_REPOSITORIES" # GIT_REPOSITORIES is in /etc/default/git-daemon 
  
-# Load the VERBOSE setting and other rcS variables +==== Un local, plusieurs distants ====
-. /lib/init/vars.sh+
  
-# Define LSB log_* functions. +J'essaie ici d'avoir un dépôt local avec différentes branches qui suivent chacune son dépôt distant, mais le tracking marche pas comme ce que j'avais compris (testé en debian squeeze, avec git 1.7.2.5).
-# Depend on lsb-base (>= 3.0-6) to ensure that this file is present. +
-/lib/lsb/init-functions+
  
-+Voici ce que j'ai fait (un seul serveur ici, mais si ça marche pour A...)
-# Function that starts the daemon/service +
-+
-do_start(+
-+
- # Return +
- #   0 if daemon has been started +
- #   1 if daemon was already running +
- #   2 if daemon could not be started +
- start-stop-daemon $SSD_OPTIONS --start --quiet --pidfile $PIDFILE --exec $DAEMON --test > /dev/null \ +
- || return 1 +
- start-stop-daemon $SSD_OPTIONS --start --quiet --pidfile $PIDFILE --exec $DAEMON -- \ +
- $DAEMON_ARGS \ +
- || return 2 +
-+
- +
-+
-# Function that stops the daemon/service +
-+
-do_stop() +
-+
- # Return +
- #   0 if daemon has been stopped +
- #   1 if daemon was already stopped +
- #   2 if daemon could not be stopped +
- #   other if a failure occurred +
- start-stop-daemon --stop --quiet --retry=TERM/30/KILL/5 --pidfile $PIDFILE --name $NAME +
- RETVAL="$?" +
- [ "$RETVAL" = 2 ] && return 2 +
- start-stop-daemon --stop --quiet --oknodo --retry=0/30/KILL/5 --exec $DAEMON +
- [ "$?" = 2 ] && return 2 +
- # Many daemons don't delete their pidfiles when they exit. +
- rm -f $PIDFILE +
- return "$RETVAL" +
-+
- +
-case "$1" in +
-  start) +
- log_daemon_msg "Starting $DESC" "$NAME" +
- do_start +
- case "$?" in +
- 0|1) [ "$VERBOSE" != no ] && log_end_msg 0 ;; +
- 2) [ "$VERBOSE" != no ] && log_end_msg 1 ;; +
- esac +
- ;; +
-  stop) +
- [ "$VERBOSE" != no ] && log_daemon_msg "Stopping $DESC" "$NAME" +
- do_stop +
- case "$?" in +
- 0|1) [ "$VERBOSE" != no ] && log_end_msg 0 ;; +
- 2) [ "$VERBOSE" != no ] && log_end_msg 1 ;; +
- esac +
- ;; +
- +
-  restart) +
- log_daemon_msg "Restarting $DESC" "$NAME" +
- do_stop +
- case "$?" in +
-   0|1) +
- do_start +
- case "$?" in +
- 0) log_end_msg 0 ;; +
- 1) log_end_msg 1 ;; # Old process is still running +
- *) log_end_msg 1 ;; # Failed to start +
- esac +
- ;; +
-   *) +
-   # Failed to stop +
- log_end_msg 1 +
- ;; +
- esac +
- ;; +
-  *) +
- echo "Usage: $SCRIPTNAME {start|stop|restart}" >&+
- exit 3 +
- ;; +
-esac +
-</code> +
- +
-Avec les prefs+
 <code bash> <code bash>
-echo 'GIT_REPOSITORIES=/home/git/repositories/' /etc/default/git-daemon +mkdir serveurA  
-</code>+cd serveurA/ 
 +h=$(basename $(pwd)); touch $h a c; echo $h c; 
 +git init --bare
  
-Mais tout ça sert pas à grand chose car il y a un paquet git-daemon-run, qui, comme son nom l'indique... +un clones (pour vérifier que le push sur les serveurs est bien ce qui est attendu) 
- +cd .. 
-Bref, ce qui suit va quand même plus vite +git clone serveurA cloneA 
-<code bash+# et aussi pour le peuplement initial 
-aptitude install git-daemon-run +cd cloneA 
-ln -s /usr/bin/sv /etc/init.d/git-daemon +h=$(basename $(pwd)); touch $h c1 c2; echo $h c2; 
-et on va modifier /etc/sv/git-daemon/run pour préciser le --base-path+git add . 
 +git commit --m "1er commit $h" 
 +git push origin master 
 +  
 +# et un dépôt local 
 +cd .. 
 +mkdir loc 
 +cd loc 
 +git init 
 +# avec qq fichiers 
 +h=$(basename $(pwd)); touch $h c2; echo $h > c2; 
 +git add . 
 +git commit -a -m "1er commit $h" 
 +# ça nous a créé une branche master, mais on veut la nommer autrement pour pas confondre avec ceux des remote 
 +# et éviter d′éventuel push/pull non désiré entre ce ce master local et les remote 
 +git branch -m master commun 
 +  
 +un alias pour le serveur 
 +git remote add remoteA ../serveurA master 
 +  
 +# une branche que l′on va synchroniser avec le serveur A 
 +git fetch remoteA                               # => 1er fetch donc créé la "branche" remoteA/master 
 +git checkout --track -b brancheA remoteA/master # => créé la branche brancheA en lien avec remoteA/master 
 +  
 +# on modifie un fichier 
 +echo  "mod 1" > cloneA 
 +git commit -m "mod 1" cloneA 
 +# que l′on veut envoyer 
 +git push 
 +#>Everything up-to-date 
 +# Ah bon ? Le tracking marche pas ? 
 +git push remoteA brancheA:master 
 +# ça push mieux 
 +# 2e modif pour voir si ça track mieux maintenant qu′on lui a montré 
 +echo  "mod 2" >> cloneA 
 +git commit -m "mod 2" cloneA 
 +git push 
 +# tj rien :-S, et avec -u ? 
 +git push -u remoteA brancheA:master 
 +#> [...] 
 +#> To ../serveurA 
 +#>    3b00bff..cb44c59  brancheA -> master 
 +#> Branch brancheA set up to track remote branch master from remoteA. 
 +# ça parait pourtant clair, mais 
 +echo  "mod 3" >> cloneA 
 +git commit -a -m "mod 3" 
 +git push 
 +#> Everything up-to-date 
 +# pas mieux...
 </code> </code>
- 
linux/memo_git.1272543470.txt.gz · Dernière modification : 29/04/2010 14:17 de daniel