Je ne m’en cache pas, je suis un pro git à fond.
Cependant et malheureusement, git n’est pas (encore) très répandu et beaucoup de projets sont encore hébergés sur des repositories SVN.
C’est le cas chez O2Sources (mais on parle d’y remédier, notamment lorsque Townce gèrera cela).

Vu que je viens de migrer ma machine de Windows vers Ubuntu, j’ai décidé d’en profiter pour faire un test.
Utiliser git-svn pour commiter en local en git et pousser par la suite sur le repository svn :)

Déjà, l’installation. Sous Debian-Like,
sudo aptitude install git-svn
Normalement, cela vous crée une commande « git-svn ». Moi, ça l’a pas fait. Du coup un petit coup de sudo find / -name git-svn; vous trouvez l’emplacement de l’exécutable (théoriquement dans /usr/bin) et y créer une commande globale.
ln -s /chemin/vers/git-svn /usr/bin/git-svn

Ensuite, commençons par récupérer notre repository
git-svn clone -s http://domaine.net/chemin/vers/le/repository
Si vous avez une arborescence avec des tags (dossiers tags/, trunk/ et branchs/), placez l’option -s.
Ainsi, git-svn les convertira en tags et branches GIT.
Sinon, c’est inutile :)

Deuxième étape : si vous avez des options git:ignore, elles ne sont pas prises en compte. Faites les donc :
git-svn show-ignore > .gitignore

Maintenant, faites vous une session de développement. Committez comme d’habitude sur votre repository git et oubliez svn (youpi !!).
Une fois que celle-ci est terminée, il vous faut committer (bah ouais hein).

Pour cela, commencons par faire un update. On sait jamais que vous seriez pas le seul à travailler et que l’un de vos collègues n’ait committé entre temps ;)
git-svn rebase
Et committons
git-svn dcommit

Vous verrez que votre repository svn a été mis à jour.
Cool non ? :)
Et vous, vous préférez GIT ou SVN ? (ouais, postez des commentaires !!)

Lorsque j’étais en Picardie la semaine dernière, en discutant avec Joris, nous en venons à parler de nos plateformes de développement personnelles.
Du coup forcément je lui explique l’architecture contraignante que je m’impose (développement local -> commit svn -> test sur serveur de préproduction -> push en production).

Et la il me dit « je n’ai jamais compris l’utilité de SVN ». Honte sur lui que je dis. Et je m’engage à lui expliquer cela.
Comme après on est arrivés au bar, je n’ai pas eu le temps de le faire. Mais c’est tous bénéfices pour vous puisque je le fais donc maintenant :)

Commençons par un peu d’histoire. Il y a trois générations de grands systèmes de gestion de version.

Il en existe d’autres évidemment. Mais je les épargne. Ce billet n’est pas là pour faire une liste de tous les systèmes de gestion de versions.

Alors comment ça fonctionne ? C’est au final assez simple.
Lorsque vous développez votre application seul et toujours sur la même machine, il est assez aisé de s’y retrouver. Vous avez toujours les dernières modifications de disponibles en local.

Le jour ou vous commencez à développer à deux ou à passer d’une machine à l’autre par contre, c’est plus embêtant.
Si vous êtes toujours seul, il vous suffirait d’une clé usb pour avoir toujours tous vos documents. Quand vous êtes à deux en revanche, cela n’est pas faisable.

Et c’est la qu’intervient le contrôle de versions.
Supposons trois fichiers : A, B, C

Vous modifiez le contenu du fichier A. Pendant ce temps un second développeur modifie le contenu du fichier B.
Ici on a que trois documents. Du coup il n’est pas difficile de s’y retrouver et de merger les modifications. Mais sur des gros projets ?

En faisant un commit sur votre contrôleur de versions, vous ne mettrez donc que le fichier A à jour. Le second développeur ne perdra pas ses modifications.
Et lorsqu’il mettra à jour sa version locale avec la version distante, il récupèrera le contenu du fichier A tel que vous l’avez modifié.

Poussons maintenant le vice plus loin :)
Le document A est particulièrement long et vous modifiez le début de celui-ci, les lignes 50 et 75 par exemple.
Le second développeur modifie les lignes 60 et 160.

Eh bien vos modifications pourront toujours être prises en compte par le contrôleur de versions, qui verra les lignes que vous avez ajouté dans le document et celles que vous avez modifié et sera capable de ne modifier que cela :)

On ira pas plus loin que cela. Il ne faut pas bousser le bouchon trop loin et il n’est pas capable de merger des modifications sur la même ligne.
En revanche, vous pouvez lui demander un café et voir ce qu’il répondra.

Ensuite, ous constaterez rapidement, en faisant quelques commits sur le contrôleur de version que vous pouvez placer un commentaire sur chacune d’elle.
Ainsi vous avez un historique de toutes les modifications apportées à chacun des fichiers de votre projet (et par qui).

C’est notamment fortement pratique dans un projet libre.  Vous pouvez par exemple suivre toutes les modifications apportées à votre projet préféré.
Voici un exemple. Il s’agit du dernier commit fait sur Ruby on Rails, durant la nuit (heure française).

Pour finir, quel contrôleur de version choisir ?
J’en utilise pour ma part, deux. SVN, sur ma machine de développement pour tous mes projets privés.
Et GIT sur github.com pour mes projets publics.

Entre les deux, je préfère git. Principalement car celui-ci implémente le contrôle de version complet en local. Vous pouvez donc faire votre commit en local puis le « pusher » et il sera en ligne. Ainsi, lors d’un voyage en train, je développe en découpant en commits lisibles et fait un push en arrivant. C’est comme si j’avais eu un accès internet durant mon voyage :)
Alors que les commits SVN font directement la mise à jour sur le serveur. C’est un peu moins propre.

Mais je fais face à quelques problèmes pour installer un serveur git sur ma machine. Pour l’instant, je dois donc encore me contenter d’un svn. Mais cela ne saurait tarder à changer.

Pour ceux qui ne connaitraient pas encore Git, c’est un logiciel de contrôle de version.
Celui-ci prends beaucoup d’ampleur depuis un an et pourrait être le remplaçant de SVN dans un futur proche.

Peut-être avez-vous également entendu parler de GitHub, qui héberge des projets en permettant leur gestion avec Git.
Quelques logiciels permettent d’installer le logiciel sur sa plateforme, que cela soit pour Windows, Mac OS X ou Linux.

Je n’ai pas testé sous Linux. Cependant sous Windows, j’ai opté pour msysgit. Et sous Mac, Git-Osx-Installer.
Je vous laisse les installer. Attention, sous Mac OS, il y a deux logiciels à installer. Tout d’abord Git, qui apportera les commandes console néessaires. Puis OpenGitGUI qui apportera une interface graphique.

Open Git GUI

Une fois que c’est installé, lancez Open Git GUI. Puis créez un nouveau repository. Placez-le dans le répertoire de votre choix.
Une fois que cela est fait, nous pouvons configurer GitHUB afin de pouvoir pousser nos commits là-bas et y héberger notre projet.

Puis rendez-vous sur GitHub et cliquez sur le lien « account » en haut à droite.
La, la page de modification de votre compte s’affichera. Si vous descendez dans la page, vous verrez un paragraphe intitulé « SSH Public Keys ».

Il vous faut créer une clé pour chacune des machines depuis laquelle vous manipulerez le projet. Chaque clé est unique à la machine, pas au projet.

Pour connaitre la clé de la machine, retournez dans OpenGitGUI et cliquez sur le menu « aide » puis sur « montrer la clé SSH ».
Si vous n’avez pas encore généré de clé, le bouton « Générer une clé » sera alors accessible. Sinon, cliquez copier dans le presse papier et placez cette clé sur GitHub.
Attention ! Connaitre cette clé permets à n’importe qui de commiter sur tous vos projets hébergés sur GitHub. Ne la partagez pas.

Une fois que ceci est fait, il faut ajouter un dépot distant sur GitHub. Cliquez sur « Dépôt distant » puis « ajouter ».
Donnez-y le nom de votre choix. L’emplacement est indiqué par GitHub, de la forme git@github.com:vous/votre-projet.git

Comme le projet est nouveau, il faut y ajouter les nouveaux fichiers. Faites donc « Commit » puis « Indéxer ».
Placez un commentaire de commit en bas à droite, puis commitez (une ou plusieurs fois afin de séparer vos diverses modifications) puis poussez vers GitHub :)
Rendez-vous sur la page de votre projet et vous pourrez constater que celui-ci est correctement hébergé là-bas.

A moitié entre le pragmatique et le ninja ?
Analyse de mes tics en développement avec le billet de miximum.

  • OS : Windows. Mais je réflechit à m’acheter un mac (peut-être l’été prochain).
  • Editeur : Aptana
  • Langage favori : aucun. Mais j’affectionne particulièrement Ruby, Python et PHP.
  • VCS : Subversion
  • Navigateur : Firefox

Je me considère entre le pragmatique et le ninja parce que j’ai beaucoup tendance à être comme ce second. Mais pas de manière aussi extrème que ce qui est dit dans cet article. Je suis donc à moitié entre les deux (avec une tendance à pencher vers le ninja).

Pourquoi rester chez un hébergeur lorsque l’un de ses concurrents vous propose une machine deux fois plus puissante pour le même prix ?
Depuis le début de la semaine, ce nouveau serveur de production (nommé laetitia) est arrivé et j’ai fait progressivement les migrations de mes divers sites depuis l’ancien serveur (nommé agnès).

L’arrivée de ce nouveau serveur marque donc la fin de ma migration vers mon nouvel environnement de développement. Après l’arrivée du serveur de développement, norris il y a un mois, ce changement de serveur de production me permet d’utiliser les données du serveur svn de norris en production.
Désolé mais je n’ai pas de photo de laetitia.

Je vous ai déjà parlé de mon nouveau collocataire, Norris.  En voulant configurer celui-ci, je me suis heurté à une légère problématique

Comment puis-je tester une application située dans mon repository SVN ?

Tout d’abord, je me suis dit "pour faire propre, je crée un repository par projet". Jusque la, facile :-)

Ensuite, Jean-Sebastien (il ne fera pas de billet là-dessus alors que cela serait une excellente manière pour lui de remplir son blog. Qu’a cela ne tienne) m’a expliqué comment il a fait sur le dépot de projets interne à O2Sources. Le principe est au final assez simple :

SVN, utilisé comme un module Apache, permet de visualiser un dépot et d’y faire des commit via le protocole DAV (à tous les étudiants de ma promo : oui je sais, je suis passé du côté obscur de la force. Mais je n’avais pas le choix).

A partir de la, tout devient très simple ! Il existe en effet davfs, qui permet de faire un mount sur une adresse DAV. Y’a plus qu’à faire un mount sur notre chemin SVN ! Je fait donc ce mount vers le chemin ou pointe le dossier parent à tous mes repository. Oui, j’ai pas envie de faire un nouveau mount à chaque fois que je fait un nouveau repository. Ca serait un peu chiant …

Et la, "connection refused". Quelle déception ! Surtout lorsque je tente sur un autre repository SVN et que je constate que cela fonctionne. Après quelques recherches, j’ai finalement tout de même réussi à monter ma partition. En effet, en cherchant à monter le dossier parent à mon repository, qui me semblait être un dossier subversion supportant DAV puisqu’il s’affichait de la même manière que les autres dans mon visualisateur, je ne montais en fait absolument pas un dossier DAV, mais un dossier tout court …

Il fallait donc que je monte directement mon repository. Pas moyen de monter le dossier parent … Ô rage, Ô désespoir. Mais c’est la que viennent faire leur apparition les branches. Pourquoi ne pas utiliser un seul repository pour tous mes projets et créer une nouvelle branche pour chaque projet :-)

Evidemment maintenant cela fonctionne. Je peux monter mon repostory "sites", dans lequel sont situés de multiples projets tels que "refstats", "kazhar", … Et comme cette parition dav contient des fichiers bruts, je peux y placer une virtualhost Apache et donc voir les fichiers présents dans mon repository subversion comme s’ils étaient en dur sur ma machine.

Pour finir, voici ce que j’ai mis dans mon fichier /etc/fstab (afin de monter la partition automatiquement au démarrage de la machine)

http://localhost/sites         /svn/sites     davfs   user,auto,ro    0       0

J’ai créé un virtualhost pour svn sur localhost afin de ne pas avoir à m’embeter à créer une identification pour la machine locale. Un identifiant et un mot de passe sont tout de même demandés au démarrage. Il suffit cependant de taper sur "entrée" pour passer à la suite.

 
Fork me on GitHub