linux:memo_git
Différences
Ci-dessous, les différences entre deux révisions de la page.
Les deux révisions précédentesRévision précédenteProchaine révision | Révision précédente | ||
linux:memo_git [24/06/2009 19:15] – daniel | linux: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' | Git est un gestionnaire de versions (comme svn, cvs ou d' | ||
- | Bonne doc en français | + | Un bon résumé de git et de son fonctionnement |
- | Mais, parfois, la centralisation | + | Avant de se lancer, il vaut mieux lire au moins les chapitres 1 et 2 du livre pro git http:// |
+ | * 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/ | ||
+ | * 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' | ||
+ | * local repository : la base git locale (qui contient tout l' | ||
+ | * 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 " | ||
+ | |||
+ | Résumé des commandes git | ||
+ | * graphique interactif efficace : http:// | ||
+ | * http:// | ||
+ | * http:// | ||
+ | * https:// | ||
+ | * chez [[http:// | ||
+ | |||
+ | La référence (les pages man) : http:// | ||
+ | |||
+ | Il y a aussi le [[http:// | ||
+ | |||
+ | Des alias intéressant sur https:// | ||
+ | |||
+ | La page de doc du plugin netbeans http:// | ||
+ | |||
+ | Tip & tricks | ||
+ | * http:// | ||
+ | |||
+ | ===== Commandes courantes ===== | ||
+ | * Modifier le dernier message de commit '' | ||
+ | * voir les serveurs distants (ajouter -v pour avoir les urls) '' | ||
+ | * editer la conf par defaut '' | ||
+ | |||
+ | ===== 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:// | Cf http:// | ||
Ligne 11: | Ligne 43: | ||
Ensuite, quelques liens utiles | Ensuite, quelques liens utiles | ||
* http:// | * http:// | ||
- | * http:// | ||
- | * http:// | ||
* http:// | * http:// | ||
+ | * http:// | ||
+ | Pour créer un dépôt centralisé avec gitosis : | ||
+ | * http:// | ||
+ | * http:// | ||
- | ===== Opérations courantes ===== | + | Ce qui suit est assez ancien et à prendre avec des pincettes (m' |
- | http://www.kernel.org/ | + | |
+ | ==== Ajout d'un dépôt local sur le serveur | ||
+ | Pour créer le dépôt, faut d' | ||
+ | writable du group qui va bien (pour déclarer qui aura le droit d' | ||
<code bash> | <code bash> | ||
- | # transformer | + | # Si ce n'est déjà fait on récupère une copie localement (coté client donc) |
+ | git clone git@< | ||
+ | cd gitosis-admin | ||
+ | joe gitosis.conf | ||
+ | # ensuite on envoie ce fichier | ||
+ | git commit -m 'ajout du dépot machintruc' | ||
+ | git push | ||
+ | # et on peut balancer notre nouveau | ||
+ | cd / | ||
+ | # si le dépot local git n' | ||
git init | git init | ||
- | # ajouter | + | # on ajoute |
git add . | git add . | ||
- | # ajouter un alias pour un projet sur un serveur | + | git commit -a -m ' |
- | git remote add alias_de_ce_projet_sur_ce_serveur user@server:path/ | + | # on créé le dépot |
- | # y envoyer les fichiers | + | git remote add origin git@<server>:< |
- | git push alias_de_ce_projet_sur_ce_serveur la_branche # "master" pour la branche principale | + | # et on envoie sur le depot origin notre branche locale master |
- | + | git push origin | |
- | # commit d`un fichier (localement) | + | # pour les push suivant, on pourra faire un simple "git push" |
- | git commit -m ' | + | |
- | # commit de tous les fichiers (localement) | + | |
- | git commit -m ' | + | |
- | # envoi de tous les derniers commit (depuis le dernier | + | |
- | git push | + | |
</ | </ | ||
- | ===== Script de démarrage ===== | + | ==== Rendre un dépôt public |
- | Mon script d'init / | + | Pour que des anonymes puissent cloner un dépôt, il faut dire à git-daemon |
<code bash> | <code bash> | ||
- | #!/bin/sh | + | cd <le --base-path spécifié dans /etc/sv/git-daemon/run> |
- | ### BEGIN INIT INFO | + | touch < |
- | # Provides: | + | # et pour retirer ces droits de lecture anonyme il suffit d' |
- | # Required-Start: | + | </code> |
- | # Required-Stop: | + | |
- | # Default-Start: | + | |
- | # Default-Stop: | + | |
- | # Short-Description: | + | |
- | # Description: | + | |
- | ### END INIT INFO | + | |
- | # Author: Daniel Caillibaud < | ||
- | PATH=/ | ||
- | DESC=" | ||
- | NAME=git-daemon | ||
- | DAEMON=/ | ||
- | # DAEMON_ARGS later (after default conf load) | ||
- | PIDFILE=/ | ||
- | SCRIPTNAME=/ | ||
- | # start-stop-daemon | + | ==== Script de démarrage ==== |
- | SSD_OPTIONS=' | + | 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 |
+ | <code bash> | ||
+ | aptitude install | ||
+ | ln -s /usr/bin/sv / | ||
+ | # et on va modifier /etc/sv/git-daemon/run pour préciser le --base-path | ||
+ | </ | ||
- | # Exit if the package is not installed | + | ===== Exemples ===== |
- | [ ! -x " | + | Ci dessous qq démos, pour vous faire une idée. |
- | # Read configuration variable file if it is present | + | Les ligne qui commencent par "#>" |
- | [ -r /etc/ | + | |
- | DAEMON_ARGS=" | ||
- | # Load the VERBOSE setting and other rcS variables | ||
- | . / | ||
- | # Define LSB log_* functions. | + | ==== Un local, plusieurs distants ==== |
- | # Depend on lsb-base (>= 3.0-6) to ensure that this file is present. | + | |
- | . / | + | |
- | # | + | J' |
- | # Function that starts the daemon/ | + | |
- | # | + | |
- | 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 | + | |
- | } | + | |
- | # | + | Voici ce que j'ai fait (un seul serveur ici, mais si ça marche pour A...) |
- | # Function that stops the daemon/ | + | <code bash> |
- | # | + | mkdir serveurA |
- | do_stop() | + | cd serveurA/ |
- | { | + | h=$(basename |
- | # Return | + | git init --bare |
- | # 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/ | + | |
- | RETVAL=" | + | |
- | [ "$RETVAL" | + | |
- | start-stop-daemon --stop --quiet --oknodo --retry=0/ | + | |
- | [ " | + | |
- | # Many daemons don't delete their pidfiles when they exit. | + | |
- | rm -f $PIDFILE | + | |
- | return " | + | |
- | } | + | |
- | case " | + | # un clones (pour vérifier que le push sur les serveurs est bien ce qui est attendu) |
- | start) | + | cd .. |
- | log_daemon_msg " | + | git clone serveurA cloneA |
- | do_start | + | # et aussi pour le peuplement initial |
- | case "$?" in | + | cd cloneA |
- | 0|1) [ "$VERBOSE" | + | h=$(basename $(pwd)); touch $h c1 c2; echo $h > c2; |
- | 2) [ "$VERBOSE" | + | git add . |
- | esac | + | git commit -a -m "1er commit |
- | ;; | + | git push origin master |
- | stop) | + | |
- | [ " | + | # et un dépôt local |
- | do_stop | + | cd .. |
- | case " | + | mkdir loc |
- | 0|1) [ "$VERBOSE" | + | cd loc |
- | 2) [ "$VERBOSE" | + | git init |
- | esac | + | # avec qq fichiers |
- | ;; | + | h=$(basename |
- | + | git add . | |
- | | + | git commit -a -m "1er commit |
- | log_daemon_msg | + | # ça nous a créé une branche master, mais on veut la nommer autrement pour pas confondre avec ceux des remote |
- | do_stop | + | # et éviter d′éventuel push/pull non désiré entre ce ce master local et les remote |
- | case "$?" | + | git branch -m master commun |
- | 0|1) | + | |
- | do_start | + | # un alias pour le serveur |
- | case "$?" in | + | git remote add remoteA ../serveurA master |
- | 0) log_end_msg 0 ;; | + | |
- | 1) log_end_msg 1 ;; # Old process is still running | + | # une branche que l′on va synchroniser avec le serveur A |
- | *) log_end_msg 1 ;; # Failed to start | + | git fetch remoteA |
- | esac | + | git checkout --track -b brancheA remoteA/ |
- | ;; | + | |
- | *) | + | # on modifie un fichier |
- | # Failed to stop | + | echo |
- | log_end_msg 1 | + | git commit -m " |
- | ;; | + | # que l′on veut envoyer |
- | esac | + | git push |
- | ;; | + | #> |
- | | + | # Ah bon ? Le tracking marche pas ? |
- | echo "Usage: $SCRIPTNAME {start|stop|restart}" >&2 | + | git push remoteA brancheA: |
- | exit 3 | + | # ça push mieux |
- | ;; | + | # 2e modif pour voir si ça track mieux maintenant qu′on lui a montré |
- | esac | + | echo "mod 2" >> cloneA |
+ | git commit -m "mod 2" cloneA | ||
+ | git push | ||
+ | # tj rien :-S, et avec -u ? | ||
+ | git push -u remoteA brancheA: | ||
+ | #> [...] | ||
+ | #> To ../serveurA | ||
+ | #> 3b00bff..cb44c59 | ||
+ | #> Branch brancheA set up to track remote branch master from remoteA. | ||
+ | # ça parait pourtant clair, mais | ||
+ | echo "mod 3" >> cloneA | ||
+ | git commit -a -m " | ||
+ | git push | ||
+ | #> Everything up-to-date | ||
+ | # pas mieux... | ||
</ | </ |
linux/memo_git.1245863749.txt.gz · Dernière modification : 24/06/2009 19:15 de daniel