Rassurez vous ceci est le dernier article de cette série sur GIT. Je pense repartir sur un peu de rails la semaine prochaine.
On me pose souvent la question « pourquoi choisir GIT et pas SVN ? »

Voici donc de manière absolument pas triée ni objective tous les arguments qui font que je préfère GIT à SVN (et de loin).
Notez que ce n’est que mon opinion. Vous pouvez en avoir une autre c’est absolument pas génant.

  • Pouvoir être nomade

    C’est ce que je montre dans mon article précédent.
    Avec GIT, contrairement à SVN, vous pouvez continuer à committer et ainsi conserver un repository avec des commits propres et pas un gros commit une fois de temps en temps. Même si vous n’êtes pas connecté ou n’avez pas accès à votre repository distant. Vous restez productif même en déplacement.

  • Une vraie gestion des tags et branches

    Avec SVN si vous désirez créer une nouvelle branche c’est pas compliqué : vous faites un copier/coller de votre répertoire trunk, le mettez dans branch/nom_de_la_branche. Et c’est fait. Y’a plus qu’à committer. Et le jour ou vous voulez fusionner les deux branches, morflez.
    Pareil pour les tags.

    GIT gère les branches et tags de manière native.
    Pas besoin d’action manuelle (copier/coller).
    Vous faites un « git branch <nouvelle_branch> » et votre branche est créée.
    Un « git checkout <branch> » et vous changez de branche active.
    Et un « git rebase <branch> <seconde_branch> » et vos deux branches sont fusionnées !

  • GitHub

    Ouais c’est pas vraiment GIT.
    Mais je kiffe littéralement GitHub.
    Pouvoir forker un projet en un clic; pouvoir commenter des commits etc.
    Tout projet libre devrait permettre ce genre de choses sur son repository. C’est ça qui pousse les autres développeurs à créer des patchs.

Ces trois arguments me suffisent personnellement à nettement préférer GIT à SVN.
Et vous ? Quel est votre logiciel de contrôle de version préféré ?

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.

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.

J’ai, depuis hier soir, un nouveau colocataire. Celui-ci se nomme Norris. Il est un peu timide. Mais il me laisse poster une photo de lui ci-dessous.

Donc, qui est Norris et que fait-il dans la vie ? Norris est un beau Shuttle K45 couplé à un processeur Intel Core 2 Duo 2,4Ghz et une barrette de 1Go de RAM.

La vie de Norris est plutôt assez cool pour l’instant puisqu’il sert de serveur de sauvegarde (automatique pour les données de mes sites et manuelle pour mes photos notemment). Cependant son potentiel va bientot décupler puisqu’il va servir de … serveur de développement. J’avai déjà parlé dans un autre billet de la refonte de mon environnement de développement. Norris étant arrivé, cette refonte peut se produire !

Comment cela va se passer ? Norris va accueillir (accueille déjà. Mais il faut faire quelques migrations encore) un serveur SVN. Chacun de mes sites web sera un répository SVN sur Norris.

Lorsqu’une nouvelle fonctionnalité sera développée, la procédure sera la suivante :

  • La fonctionnalité est développée et testée sur la machine locale
  • Le développeur (moi) fait un commit de la version présente sur sa machine vers le serveur de développement
  • Le développeur et toute personne autorisée à cela peut tester l’application en cours de développement, afin de supprimer tous les bugs existants notemment
  • Lorsque l’application est prète, un svn update est fait depuis le serveur de production. La version de développement passe en production :-)

Ainsi en placant une interface similaire à l’interface de développement, on évite des bugs de mise en production qui pourraient arriver pour des raisons X ou Y. Cela faisait un certain temps que je voulais appliquer ce genre de règle à mes développement personnels. C’est maintenant chose faite :-)

P.S. : si vous aimez pas le nom Norris (en référence à Chuck Norris, l’Homme qui avait déjà tout vécu avant que toute chose n’existe), faut raler auprès de TOMHTML. C’est son idée.

 
Fork me on GitHub