Outils pour utilisateurs

Outils du site


linux:memo_git

Ceci est une ancienne révision du document !


Git

Git est un gestionnaire de versions (comme svn, cvs ou d'autres) décentralisé.

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

Avant de se lancer, il 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, pas sur des diff entre deux révisions) et éviter ensuite de se retrouver dans une situation où l'on croyait savoir mais on y comprend plus rien. Il faut surtout bien 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”).
  • 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 la remise pour des exemples). Indispensable avant de changer de branche par ex.

Résumé des commandes git :

La référence (les pages man) : http://git-scm.com/docs

Il y a aussi le git community book en fr, avec son 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

Dépôt central

Ajout d'un dépôt local sur le serveur

Pour créer le dépôt, faut d'abord modifier gitosis.conf pour lister le nouveau repository sur la ligne writable du group qui va bien (pour déclarer qui aura le droit d'écrire sur ce dépôt). Et pour modifier ce gitosis.conf

# Si ce n'est déjà fait on récupère une copie localement (coté client donc)
git clone git@<server>:gitosis-admin.git # on suppose que git est le user du server qui permet d'accéder aux dépôts)
cd gitosis-admin
joe gitosis.conf
# ensuite on envoie ce fichier
git commit -m 'ajout du dépot machintruc' gitosis.conf
git push
# et on peut balancer notre nouveau projet qui existe localement
cd /path/2/mon_projet
# si le dépot local git n'existe pas on le créé
git init
# on ajoute tous les fichiers (mais on pourrait n'en préciser que certains seulement)
git add .
git commit -a -m 'Premier commit'
# on créé le dépot distant (on a déjà déclaré mon_projet dans gitosis.conf tout à l'heure), on l'appelle origin
git remote add origin git@<server>:<mon_projet>.git
# et on envoie sur le depot origin notre branche locale master
git push origin master
# pour les push suivant, on pourra faire un simple "git push"

Rendre un dépôt public

Pour que des anonymes puissent cloner un dépôt, il faut dire à git-daemon qu'il peut l'exporter en lecture seule sans vérifier les clés ssh avec

cd <le --base-path spécifié dans /etc/sv/git-daemon/run>
touch <mon_projet.git>/git-daemon-export-ok
# et pour retirer ces droits de lecture anonyme il suffit d'effacer ce fichier vide.

Script de démarrage

Mon script d'init /etc/init.d/git-daemon (basé sur /etc/init.d/skeleton)

#!/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
DESC="git-daemon (which handles git protocol on 9418 port)"
NAME=git-daemon
DAEMON=/usr/bin/$NAME
# DAEMON_ARGS later (after default conf load)
PIDFILE=/var/run/$NAME.pid
SCRIPTNAME=/etc/init.d/$NAME
 
# start-stop-daemon options
SSD_OPTIONS='--chuid git:git --nicelevel 5 --background' # git-daemon doesn't detach himself
 
# Exit if the package is not installed
[ ! -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
. /lib/init/vars.sh
 
# Define LSB log_* functions.
# Depend on lsb-base (>= 3.0-6) to ensure that this file is present.
. /lib/lsb/init-functions
 
#
# 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}" >&2
	exit 3
	;;
esac

Avec les prefs

echo 'GIT_REPOSITORIES=/home/git/repositories/' > /etc/default/git-daemon

Mais tout ça sert pas à grand chose car il y a un paquet git-daemon-run, qui, comme son nom l'indique…

Bref, ce qui suit va quand même plus vite

aptitude install git-daemon-run
ln -s /usr/bin/sv /etc/init.d/git-daemon
# et on va modifier /etc/sv/git-daemon/run pour préciser le --base-path
linux/memo_git.1337728672.txt.gz · Dernière modification : 23/05/2012 01:17 de daniel