Présentation
Cette page recense les notes de l’auteur Ă propos de Git. Vous trouverez possiblement des astuces ou des commandes qui pourraient vous mettre sur la voie (quand vous rencontrez un problème).
Les hooks : dĂ©clencher un script Ă l’envoi d’un commit
Les hooks sont des déclencheurs qui actionnent un script selon certains évènements :
- avant de recevoir des modifications sur le dépôts
- après avoir reçu des modifications sur le dépôt
- pendant une mise Ă jour
- après une mise à jour
- etc.
Pour les hooks je me suis notĂ© qu’il faut :
- vérifier que la partition sur laquelle se trouve le dépôt contient exec grâce à la commande :
mount
Si exec n’est pas ajoutĂ©, tentez :
mount -o remount,defaults,exec /chemin/partition
- Aller dans le dossier hooks et rendre exécutable le déclencheur que nous voulons et qui contient le script que nous voulons exécuter (par exemple le post-receive) :
cd /chemin/vers/depots/git/hooks/
chmod a+x post-receive
- Ajouter le code que nous voulons effectuer
Astuce
Je n’aime pas le fait de mettre directement le code dans le dĂ©clencheur (hook). Du coup je prĂ©fère Ă©diter le fichier, par exemple post-receive et ajouter une ligne comme :
sh /chemin/vers/mon/script.sh
Ce qui a l’avantage d’avoir le script quelque part dans la machine ;)
Il est possible de faire la mĂŞme chose en supprimant le fichier post-receive et en faisant un lien symbolique :
cd hooks
rm post-receive
ln -sf /chemin/vers/mon/script.sh post-receive
Copie d’un dĂ©pĂ´t en vue de l’afficher dans un outil de gestion (Redmine par exemple)
C’est encore en phase de test, mais voici deux codes utilisĂ©s pour l’export d’un dĂ©pĂ´t git dans un nouveau dĂ©pĂ´t --bare.
Par ailleurs les dĂ©pĂ´ts ne sont pas distants mais locals (oui c’est inutile je sais… )
Système D
## Systeme D
rm -rf /depots/publics/projet
git clone --bare /depots/officiels/monprojet /depots/publics/projet
chown www-data:www-data /depots/publics/projet -R
Plus propre
Requis :
- avoir crĂ©e le dĂ©pĂ´t /depots/publics/projet Ă l’aide de la commande :
git clone --bare /depots/officiels/monprojet /depots/publics/projet
- avoir ajouté un dépôt externe via la commande :
git remote add origin /depots/officiels/monprojet
Ensuite on peut utiliser le code suivant :
cd /srv/toile/depots/panheroic
git fetch origin && git reset -- refs/remotes/origin/master > /dev/null
Avec un plugin Redmine
Un plugin Redmine existe pour simplifier la vie : https://github.com/kahseng/redmine_gitolite_hook/blob/master/README.rdoc
OU un autre encore : https://github.com/ericpaulbishop/redmine_git_hosting
Export d’un dĂ©pĂ´t git (Ă©quivalent svn export)
Cf. http://stackoverflow.com/questions/160608/how-to-do-a-git-export-like-svn-export
La mĂ©thode que j’ai retenue :
cd /chemin/vers/mon/depots/git/
git archive maBranche | /bin/tar -x -U -C /destination/voulue/
Ă€ noter que maBranche n’est pas obligatoire.
Accès public à un dépôt
Via le protocole git://
Si on utilise l’outil git-daemon-run, rendre un dĂ©pĂ´t public n’est pas compliquĂ©.
Il y a deux méthodes :
- soit on ajoute --export-all dans le fichier /etc/sv/git-daemon/run à la ligne qui donne les dépôts
- soit on ajoute le fichier git-daemon-export-ok dans les dĂ©pĂ´ts dont nous avons besoin d’un accès
Il ne reste alors plus qu’Ă rĂ©cupĂ©rer le dĂ©pĂ´t de la manière suivante :
git clone git://SERVEUR/nom_depot.git
Via le protocole http:// en mĂŞme temps que Gitweb
Notes :
- Dossier oĂą se trouvent les fichiers pour gitweb : /var/www/git
- Dossier où se trouvent les dépôts : /srv/depots/git
Il faut :
- avoir un dépôt de type --bare (pas obligatoire, mais dans ce cas il faut y accéder par le dossier .git)
- utiliser la commande git update-server-info dans CHACUN des dĂ©pĂ´ts qu’on veut partager via le net
- Mettre ceci dans Apache :
<VirtualHost *:80>
ServerAdmin admin@domaine.tld
ServerName git.domaine.tld
DocumentRoot /srv/depots/git
SetEnv GITWEB_CONFIG /etc/gitweb.conf
RewriteEngine on
RewriteRule ^/$ /gitweb [PT]
RewriteRule ^/(.*<br/>.git/(?!/?(HEAD|info|objects|refs)).*)?$ /gitweb%{REQUEST_URI} [L,PT]
# Aliases
ScriptAlias /gitweb /var/www/git/gitweb.cgi
Alias /gitweb.css /var/www/git/gitweb.css
Alias /git-logo.png /var/www/git/git-logo.png
Alias /git-favicon.png /var/www/git/git-favicon.png
</VirtualHost>
Ainsi vous accĂ©dez Ă gitweb via l’adresse suivante : http://git.domaine.tld/ et allez dans les projets avec http://git.domaine.tld/mon_projet.git/ mais vous pouvez aussi faire :
git clone http://git.domaine.tld/mon_projet.git
VĂ©rifier le contenu du dossier /var/www/git Ă l’aide d’un ls -l, il semblerait que gitweb.cgi soit devenu index.cgi.
Il faudrait donc remplacer la ligne suivante :
ScriptAlias /gitweb /var/www/git/gitweb.cgi
par :
ScriptAlias /gitweb /var/www/git/index.cgi
Utilisateur de Gitolite, pour vous simplifier la vie avec git update-server-info, faites un lien symbolique vers le dossier .gitolite comme ceci :
ln -sv /usr/share/git-core/templates/hooks/post-update.sample /srv/depots/git/.gitolite/hooks/common/post-update
Puis lancez Ă nouveau gl-setup pour mettre Ă jour ce qu’il faut.
Et le tour est joué !
Lien : Configurer gitweb pour les accès HTTP avec git (en)
Via SSH
git clone UTILISATEUR@SERVEUR:mon_depot.git
Migration d’un dĂ©pĂ´t d’un serveur Ă un autre
- origine : serveur.org
- destination : destination.org
- utilisateur : git (sur les deux machines)
git clone git@serveur.org:projets/mondepot.git
cd mondepot.git
git remote add -m master -t master --tags distante ssh://git@destination.org:PORT/projets/mondepot.git
git push -f --all distante
git push --tags distante
git checkout --track autrebranche
git push distante autrebranche