Il y a 389 articles et 19 utilisateurs inscrits (ce bandeau est défini dans MediaWiki:Sitenotice)
Git
Créer un projet Git
[modifier | modifier le wikicode]Cette page s'attache à décrire la mise en place d'un dépôt git pour un nouveau projet. Si vous chercher à travailler avec un projet existant, consulter plutôt récupérer les sources d'un projet existant.
Sur le serveur
[modifier | modifier le wikicode]Il faut créer un dépôt vide, dit « --bare, sur le serveur. Celui-ci ne contiendra que le dossier .git (répertoire « magique »), sans répertoire de travail<ref>what is a bare repo?</ref> :
monProjet=<nom-du-projet> # sans espace ou caractères accentués (du ASCII uniquement)
mkdir $monProjet # on créé un répertoire vide
cd $monProjet # on se place dedans
git init --bare # on initie le dépôt git
C'est fini pour la configuration git sur le serveur.
SSH
[modifier | modifier le wikicode]Il est nécessaire d'autorisé l'utilisateur git à se connecter au serveur via SSH. Vérifier que cet utilisateur est bien présent dans /etc/ssh/sshd_config :
AllowUsers ajlsm ... git
Puis relancé le service :
/etc/init.d/sshd restart
Localement
[modifier | modifier le wikicode]On pensera à installer git si il n'est pas déjà présent :
apt-get install git
Mise en place Git
[modifier | modifier le wikicode]On créé le dossier du projet sur notre machine et on initialise un dépôt git :
monProjet=<nom-du-projet> # comme sur le serveur
mkdir $monProjet # on créé un dossier pour le dépot
cd $monProjet # on se place dedans pour l'initialiser
git init
On va maintenant ajouter quelques fichiers pour un premier commit :
git add <fichier> <fichier> …
git commit -m "My initial commit message"
Il faut maintenant indiquer où notre dépôt va se synchroniser et pousser notre premier commit sur la branche principale :
git remote add origin ssh://git@moorea/home/git/$monProjet.git
git push -u origin master
Problèmes
[modifier | modifier le wikicode]Si aucune branche n'est spécifiéé, vous obtiendrez l'erreur suivante :
git push ssh://git@moorea/home/git/$monProjet.git 130 ↵
Password:
No refs in common and none specified; doing nothing.
Perhaps you should specify a branch such as 'master'.
fatal: The remote end hung up unexpectedly
error: failed to push some refs to 'ssh://git@moorea/home/git/$monProjet.git'
Pour résoudre, il suffit de faire :
git push $monProjet master
On obtient alors :
Password:
Counting objects: 9479, done.
Delta compression using up to 8 threads.
Compressing objects: 100% (6384/6384), done.
Writing objects: 100% (9479/9479), 189.75 MiB | 42.16 MiB/s, done.
Total 9479 (delta 2753), reused 9479 (delta 2753)
To ssh://git@moorea/home/git/bm-orleans.git
* [new branch] master -> master
Récupérer un projet
[modifier | modifier le wikicode]Cette section suppose qu'un dépot du nom monProjet est disponible sur le serveur moorea.
À partir de zéro
[modifier | modifier le wikicode]On clone (git clone) le contenu du dépôt existant :
git clone ssh://git@moorea/home/git/monProjet.git monDossier
Mise à jour de distant vers local
[modifier | modifier le wikicode]On tire (git pull) les mises à jour depuis le dépôt :
git pull <maBrance> ssh://git@moorea/home/git/monProjet.git monDossier
- <maBrance>, si elle fait référence à master, alors elle est facultative.
Mettre à jours les configurations serveurs avec Git
[modifier | modifier le wikicode]Modification sur la branche principale: master
[modifier | modifier le wikicode]On commence se place sur la branche master et on fait les modifications que l'on souhaite :
git checkout master
# édition des fichiers
# ...
# fin de l'édition des fichiers
git commit # on commit dans l'historique local
git push ssh://git@moorea/home/git/shell-scripts.git # envoi sur le serveur AJLSM
Mise à jour des différents projets git
[modifier | modifier le wikicode]On pourra consulter la page Git Tip: How to "Merge" Specific Files from Another Branch pour connaître les différentes approches possibles Git Tip: How to "Merge" Specific Files from Another Branch. Nous détaillons ici celles utilisées par l'équipe.
Merge complet de master dans maBranche
[modifier | modifier le wikicode]Pour chaque branche, on bascule sur celle-ci et on fait un merge, une résolution manuelle des conflit et on commit :
git checkout <branch> # changement de branche
git merge master # on récupère les modifications de master
On peut avoir des conflits qui apparaissent, il faut alors les résoudres à la main :
git mergetool fichier
On finit par commiter le faire :
git commit -m "Merge de master"
Merge de certains fichiers
[modifier | modifier le wikicode]Pour éviter les conflits sur .projectrc, on peut fusionner uniquement les fichiers modifier. Pour ce faire, on fait un git checkout des fichiers en questions, puis un commit des modifications :
git checkout master <fichier(s)>
Mise à jour des serveurs
[modifier | modifier le wikicode]git checkout branchXYZ avant de mettre à jours les fichiers sur le serveurs, sous peine d'utiliser les mauvais fichier de configuration.Pour le moment il n'y a pas de scripts d'automatisation, on se connecte donc à chaque serveur manuellement pour copier les fichiers. À terme on fera un script shell du type donc le pseudo-code est :
Se placer dans le dépôt # shell-script
Lister les branches
Pour chaque branche
Basculer sur la branche # git checkout $branche
Copie le dossier courant vers le serveur correspondant # scp -r ./ ajlsm@"$branch".prod
FinPour
Résolution de conflits Git
[modifier | modifier le wikicode]Pré-requis
[modifier | modifier le wikicode]On installera un ensemble d'outil et on configurera git en conséquence pour se simplifier le travail.
Meld
[modifier | modifier le wikicode]Permet de comparer des fichiers, des dossiers ou des versions dans des systèmes de versionnage à l'aide d'une interface simple.
sudo apt-get install meld
Il faut ensuite configurer meld comme l'outil de différence et de merge par défaut de git. Cela permettra d'invoquer meld avec la simple commande git diff et git mergetool.
git config --global merge.tool meld
git config --global diff.tool meld
git-Meld
[modifier | modifier le wikicode]Permet d'utiliser Meld pour comparer des fichiers ou des branches, ce qui est plus intuitive que le mode console. C'est un projet à récupérer sur github<ref>git-meld sur Github</ref> :
installDir=~/apps # changer le si besoin
cd "$installDir"
git clone git://github.com/wmanley/git-meld.git
Il faut ensuite rajouter l'alias dans la configuration de git pour pouvoir faire git meld
git config --global alias.meld "$installDir"/git-meld/git-meld.pl
Comparer des branches
[modifier | modifier le wikicode]Pour voir si deux branches divergent l'une de l'autre, on pourra utiliser l'une des commandes<ref>View differences of branches with meld?</ref> :
git diff master..branchXYZ # natif
git meld master..branchXYZ # graphiquement
Si des différences existent et que l'on souhaite récupérer les modification de master dans branchXYZ, alors on fera un merge.
Merge/Fusion de fichier
[modifier | modifier le wikicode]Après avoir vérifier qu'il y avait bien des différence, on fait un merge.
Merge
[modifier | modifier le wikicode]Pour cela on se place sur la branche qui recevra les modifications (branchXYZ) de la branche de « référence » (master) :
git checkout branchXYZ
git merge master # récupère les modifications de master et les appliquent à branchXYZ
Résolutions manuelles des conflits
[modifier | modifier le wikicode]Il est courant d'avoir des conflits après un merge, pour finir la procédure, il faut les résoudre un part un avec<ref>Merging With a Conflict: Conflicts And Resolutions</ref> <ref>Merging With a GUI</ref> :
git mergetool "$file"
L'interface se présente alors de la façon suivante :

- gauche : fichier de la branche cible (branchXYZ) ;
- milieu : résultat du merge/de la résolution qui sera utiliser ;
- droite : fichier de la branche source (master).
Voir aussi
[modifier | modifier le wikicode]- Git – setting up a remote repository and doing an initial “push”
- FAQ Git
- Using SWT from Git / Using Egit
- simple remote git repo howto
- How To Install A Public Git Repository On A Debian Server
- all about "bare" repos -- what, why, and how to fix a non-bare push
Import un projet Git depuis SVN
[modifier | modifier le wikicode]Import SVN
[modifier | modifier le wikicode]On créé un dossier hybride git-svn en laissant les détails SVN The second command initializes the directory as a git-svn hybrid thing and points the origin at your SVN repository :
git svn init svn+ssh://moorea/home/svn/<monProjet>/trunk --no-metadata
Remarques :
la commande est git-svn ou git svn (espace) selon le système.
Nettoyage
[modifier | modifier le wikicode]Pour avoir un projet propre, on clone leaving behind all the SVN cruft that was there to support the git-svn stuff. :
<syntaxhighlight lang="bash"> git clone bm-orleans-git bm-orleans.git< /syntaxhighlight>
Création du dépôt
[modifier | modifier le wikicode]En sachant que :
- « pushing is going to be a lot more efficient than sending over .git », cmn sur #git
Références
[modifier | modifier le wikicode]<references/>