Il y a 389 articles et 19 utilisateurs inscrits (ce bandeau est défini dans MediaWiki:Sitenotice)

Git

De AJLSM
Aller à la navigation Aller à la recherche

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.

Important :
L'utilisation d'espace ou de caractères accentués entraînera des comportement inattendu. Rester sur des caractères appartenant à la table ASCII.

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


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


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


Important :
Cette méthode génère des conflits sur les fichiers .projectrc qu'ils faut résoudre manuellement et à chaque fois.

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]
Important :
Il est impératif de comprendre les effet d'un 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]

On installera un ensemble d'outil et on configurera git en conséquence pour se simplifier le travail.


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

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.

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).
Notice :
Dans l'image on récupérer le contenu de test dans master.




Import un projet Git depuis 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.

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

<references/>