Dans mon précédent journal, j'ai clairement indiqué ma préférence sur les gestionnaires de versions distribués (comme Git), par rapport aux gestionnaires de versions centralisés (comme Subversion). Je n'avais alors pas justifié ma position, mais je souhaite maintenant le faire. C'est vrai ca, pourquoi Git* m'importe ?
Un des arguments souvent rencontrés pour justifier l'intérêt de Git est la vitesse des opérations. C'est vrai que c'est agréable de pouvoir commiter instantanément. Pourtant, je travaille régulièrement avec svn, et ce manque de rapidité n'est pas quelque chose qui me gêne beaucoup. Cet argument à lui seul ne suffit pas à justifier le passage de svn à Git.
Les gestionnaires de versions distribués permettent, par définition, de commiter depuis n'importe où (dans le train, le métro, l'avion, les toilettes, etc.). Pourtant, ce genre d'utilisations reste assez marginal, et à l'exception de quelques personnes, c'est une possibilité extrêmement peu utilisée.
On peut également reprocher certaines choses à svn (comme l'impossibilité d'annuler un commit), mais ce sont des choix de design de subversion, et un autre gestionnaire centralisé pourrait les corriger.
Pour ma part, je pense que le plus grand apport de git est son aspect distribué, ce qui permet de mettre entre toutes les mains un gestionnaire de versions avec ses avantages. Avec subversion, seules les personnes autorisées peuvent accéder au dépôt et créer des branches pour faire des essais. De l'autre coté, n'importe qui peut cloner un dépôt Git, créer sa branche expérimentale et continuer à suivre les développements fait sur le dépôt officiel.
Prenons un exemple (fictif) : je suis un utilisateur régulier du logiciel XYZ, j'en suis content, mais je n'arrive jamais à m'y retrouver dans l'écran des options. Je décide donc d'essayer de refaire cet écran, mais comme je passe beaucoup de temps sur la tribune, il va probablement me falloir plusieurs semaines avant de pouvoir proposer un patch à l'auteur.
Premier cas : le logiciel XYZ est versionné avec subversion. Je fais donc un checkout du trunk, et je commence à travailler dessus. Au bout de deux semaines, je commence à avoir une version intéressante de cet écran, mais entre temps, le développement a continué sur le trunk, et une nouvelle option est apparue. Je décide de faire un svn up, mais malheureusement, l'inévitable se produit : un conflit sur plusieurs fichiers. Ce n'est pas très grave, j'arrive à les corriger, et je peux me remettre au travail. J'arrive enfin à un écran des options qui me convient, et juste au moment où j'allais me décider à envoyer mon patch à l'auteur, je me dis que j'essayerais bien d'intervertir 2 options. Je fais ce dernier changement, mais pas le temps de le tester, je pars en vacances. A mon retour, je me rends compte qu'intervertir ces 2 options était une mauvaise idée. Malheureusement, comme je n'ai pas pu commité mes changements, je me retrouve à devoir me rappeler ce que j'avais fait avant de partir pour pouvoir annuler ces changements. Enfin, je peux proposer mon patch à l'auteur. Ouf.
Deuxième cas : je fais un svn export du même dépôt, puis je créé un dépôt svn local pour gérer mes avancées. Je peux tranquillement travailler sur mon écran d'options. Quand j'arrive à quelque chose de convaincant, je propose un patch à l'auteur, qui le refuse, car celui-ci ne s'applique pas sur le trunk. J'essaye alors de me synchroniser avec le dépôt officiel, mais entre les nombreux conflits et le trunk qui n'arrête pas d'évoluer, je finis par abandonner :(
Maintenant, le même scénario avec Git se serait beaucoup mieux passé. J'aurais profité de tous les avantages d'un code versionné. Par exemple, j'aurais pu commiter régulièrement mes avancées, ce qui m'aurais permis de profiter de git diff, git log, etc. Si, après récupéré les mises à jour du dépôt officiel, je me serais rendu compte que résoudre les conflits est plus compliqué que prévu, je peux retourner à la révision précédente et continuer à travailler dessus (en laissant le travail de résolution des conflits pour quand j'aurais plus de temps/volonté à y consacrer). Enfin, je n'aurais rencontré aucune difficulté à annuler un des mes changements. Bref, j'aurais pu profité des avantages d'un code versionné.
Ici, on peut assez facilement s'en sortir avec svn et quelques bidouillages (faire régulièrement des tarballs de ses avancées), mais imaginer que vous vouliez vous mettre à plusieurs pour proposer une nouvelle fonctionnalité majeure pour votre logiciel préféré. Bien entendu, vous n'avez pas accès au dépôt officiel, sinon ce serait trop simple ;)
Pour moi, la grande force des gestionnaires de versions distribués est là : pouvoir créer une branche même sans accès au dépôt officiel. Cette branche distante est la seule façon sereine de faire des développements expérimentaux tout en continuant à se synchroniser sur la base de code officielle. Les gestionnaires de versions distribués cassent cette barrière entre ceux qui ont accès au dépot officiel et les autres.
* je parle de Git, mais Mercurial ou Bazaar-NG ou un autre DSCM ferait aussi l'affaire.
> Lire le journal (64 commentaires, moyenne: 3,1).
Vous avez demandé le commentaire #914275.



git > bzr
Ave,
Franchement, pour avoir découvert git avec le dév noyau et hal, c'est vraiment un bon logiciel. J'ajouterai quelques avantages :
rapide : gérer les mégas de sources du noyau implique un code vraiment rapide, contrairement à bzr qui est lent, très lent
stable : j'ai jamais réussit à mettre git dans la mouise alors que j'ai souvent de pb avec svn et bzr de malsuppression et autre erreur qui rende l'état du dépôt incohérent …
maîtrise du commit : le "stage" avant commit est une merveille. Ça permet de maîtriser complètement ce qu'on met dans le commit.
Y'en a certainement d'autres. Je suis déçu de baz, c'est pas lent et instable et ça ne pardonne pas pour du gestionnaire de source.
Étienne.
E Ultreïa !
[^]Re: git > bzr
ça m'intéresse beaucoup ce que tu dis car, effectivement, le gros défaut de SVN à mes yeux est la facilité avec laquelle tu peux tout foutre en l'air : un répertoire .svn malheureusement effacé dans un sous-répertoire, un fichier effacé ou déplacé sans utiliser SVN, un soft un peu buggué (NautilusSVN m'a plusieurs fois écrit une date de commit en 1970 qui plante complètement tout SVN).
Est-ce que git est vraiment mieux à ce niveau ? Est-ce qu'il existe des interfaces permettant d'utiliser une interface git sur un serveur SVN ? Et le contraire ? Et y'a-t-il un document "Git pour les administrateurs SVN" qui me permettrait de convaincre mon admin SVN de tenter le coup de Git ? Et un document simple et clair à destinations des développeurs ?
[^]Re: git > bzr
Étant donné que, SVK mis à part, les gestionnaires de versions, décentralisés comme centralisés, ont tendance à stocker des fichiers opérationnels dans le répertoire de travail, tu ne peux guère éviter de lourdes conséquences à la suppression du répertoire .svn/, .cvs/, ou .bzr/. Quant au fichier déplacé ou supprimé sans utiliser SVN, on a toujours la possibilité d'en committé ultérieurement la modification.
Et je ne pense pas que git soit plus à l'abri d'une interface graphique boguée.
[^]Re: git > bzr
Oui, git stocke aussi ces fichiers dans le répertoire courant (dans le répertoire .git). Il n'est donc pas plus à l'abri des erreurs de manipulations. La seule différence, c'est que git utilise un seul sous-répertoire, alors que svn créé un .svn par répertoire.
[^]Re: git > bzr
l'air de rien, ça peut déjà changer beaucoup je trouve. Je pense par exemple au bazar que j'ai obtenu quand un collègue a commité un répertoire automatiquement regénéré par eclipse à chaque compilation.
[^]Re: git > bzr
Par exemple, un grep récursif qui ne touche pas aux données de git, ça se fait avec
grep toto -rn *
(enfin, sauf si on veut que grep regarde aussi dans des fichiers cachés dans le répertoire racine)
Avec subversion, le même va ignorer le .svn à la racine, mais pas les autres. Résultat, c'est beaucoup plus facile de foutre en l'air (là, j'ai pris grep, mais on peut faire pareil avec un « perl -pi -e ... » ...) une copie de travail svn qu'une copie de travail avec git. Par contre, les conséquences d'une corruption du .git/ sont en général plus désastreuses avec Git qu'avec SVN ...
[^]Re: git > bzr
Oui mai avec SVK, on n'a même plus besoin d'y penser puisque ces fichiers ne sont plus situés dans le répertoire de travail.
[^]Re: git > bzr
Oui, ce qui une pas bête idée du tout.
Ceci dit, y'a pas de solution parfaite : avec SVK, si tu déplaces ta copie de travail, ça met aussi le bronx. Mais l'argument est que ça arrive moins souvent de déplacer sa copie de travail que de faire des conneries avec les .bidules/ à l'intérieur de la copie de travail.
Au passage, avec Git, on peut simuler un comportement à la SVK en positionnant $GIT_DIR. Mais évidemment, si on a plusieurs repositories, c'est affreusement pas pratique de devoir changer la variable d'environnement à chaque fois qu'on change de copie de travail. C'est plus un truc pour cas particuliers dans des scripts que vraiment adapté à une utilisation quotidienne.
[^]Re: git > bzr
J'ajouterais qu'il y a une toute récente option à SVK qui permet de déplacer le .svk dans le répertoire de travail mais pour l'instant, je n'ai pas bien compris l'intérêt.
Je voulais m'en servir pour pouvoir déplacer ma copie sur clé usb mais je ne vois pas comment replacer la dite copie dans le giron du SVK local...
[^]Re: git > bzr
git at bzr ont un seul répertoire à la racine du projet, c'est bien plus robuste que les .svn et les CVS éparpillés. C'est critique surtout lorsqu'on renomme ou qu'on supprime des dossiers.
le bzr push est très lent, et supporte très mal une erreur lors de la transaction. J'ai pas encore testé pour git.
Étienne.
E Ultreïa !