Nous utilisons CC depuis un peu plus de quinze ans maintenant. Il a beaucoup de bonnes fonctionnalités.
Tout notre développement se fait sur des branches ; j'en ai créé deux aujourd'hui, pour deux ensembles différents de changements. Après avoir vérifié la branche, j'ai demandé à un collègue de revoir les changements, puis j'ai fusionné dans /main/LATEST - qui se trouve être l'endroit où mon travail devait aller. Si cela avait été pour une version plus ancienne sur une branche, cela n'aurait pas été plus difficile.
Les fusions à partir de mes branches temporaires étaient entièrement automatiques ; personne n'avait modifié les fichiers sur lesquels je travaillais pendant que je les faisais vérifier. Bien que par défaut les extractions soient réservées (verrouillées), vous pouvez toujours annuler la réservation de l'extraction plus tard, ou créer l'extraction sans réservation. Lorsque les modifications prennent plusieurs jours, la resynchronisation de ma branche temporaire avec la branche principale est facile et généralement automatique. L'outil de fusion est correct ; le plus gros problème pour moi est que ma machine serveur est à environ 1800 miles de mon bureau (ou de ma maison), de sorte que X sur cette distance est un peu lent (mais pas intolérablement). Je n'ai pas utilisé de meilleur mergetool, mais cela ne veut peut-être pas dire grand chose puisque je n'ai pas utilisé d'autre mergetool graphique.
Les vues (vues dynamiques) sont rapides sur notre installation. Je n'ai pas utilisé de vues instantanées, mais je ne travaille pas sous Windows quand je peux l'éviter (notre équipe utilise des vues instantanées sous Windows ; je ne sais pas trop pourquoi). Nous avons des systèmes de branchement complexes, mais le développement principal est effectué sur /main/LATEST, et le travail de libération est effectué sur une branche. Après l'AG, le travail de maintenance est effectué sur une branche spécifique à la version, et fusionné vers /main/LATEST (via toute version intermédiaire).
Le CC a besoin de bons administrateurs - nous en avons et nous avons la chance d'en avoir.
CC n'est pas facile à utiliser, bien qu'en ce moment, je trouve "git" aussi intimidant que CC pour ceux qui ne l'ont pas utilisé. Mais les bases sont à peu près les mêmes - checkout, change, checkin, merge, branch, et ainsi de suite. Les répertoires peuvent être branchés - avec précaution - et sont certainement contrôlés en version. C'est inestimable.
Je ne vois pas le bureau changer de CC à tout moment.
Numéros de version intégrés - bien ou mal ?
J'ai écrit :
Le plus gros problème que j'ai avec CC est qu'il n'intègre pas les numéros de version dans les fichiers sources - un problème que git a aussi, AFAICT. Je comprends à moitié pourquoi ; je ne suis pas sûr d'aimer renoncer à cette traçabilité, cependant. Ainsi, j'utilise toujours RCS (même pas CVS) pour la plupart de mes travaux personnels. Un jour, je passerai peut-être à git - mais ce sera un choc et il faudra beaucoup de travail pour réorganiser les systèmes de publication configurés autour de (SCCS et) RCS.
En réponse, @VonC note :
Nous avons toujours considéré cette pratique comme maléfique (mélanger les informations de méta-données aux données), introduisant "l'enfer de la fusion". Voir aussi Comment obtenir la version du fichier Clearcase à l'intérieur d'un fichier Java . Bien sûr, vous pouvez utiliser un déclencheur pour la substitution de mots-clés RCS ( Manuel Clearcase : Exemple de déclencheur Checkin ) à condition que vous utilisiez un gestionnaire de fusion approprié .
Cette discussion soulève plusieurs questions, qui sont toutes mélangées. Mon point de vue frise l'archaïsme, mais il est fondé sur un raisonnement, et je vais prendre le temps de l'écrire (il a été chamboulé par la vie - il faudra peut-être plusieurs éditions pour le terminer).
Contexte
J'ai appris SCCS en 1984, à peu près au moment où RCS est sorti (1983, je crois), mais SCCS était sur ma machine et l'internet était au mieux naissant. Je suis passé de SCCS à RCS à contrecoeur au milieu des années 90 parce que le format de date de SCCS utilise des chiffres à deux chiffres pour les années et il n'était pas clair si SCCS serait universellement corrigé à temps (il l'a été). A certains égards, je n'aime pas RCS autant que SCCS, mais il a quelques bons points. Commercialement, mon employeur a utilisé SCCS jusqu'à la mi-1995, mais ils ont commencé à passer à Atria ClearCase dès le début de 1994, en s'attaquant à des ensembles de produits distincts un par un.
Première expérience de ClearCase avec les déclencheurs - et l'enfer des fusions
Notre projet a migré plus tard, alors que nous avions déjà une certaine expérience de CC. En partie parce que j'ai insisté sur ce point, nous avons intégré des informations de contrôle de version dans les fichiers sources par le biais d'un déclencheur check-in. Cela a duré un certain temps - mais seulement un certain temps - car, comme le dit VonC, cela conduit à l'enfer de la fusion. Le problème est que si une version avec l'étiquette /main/branch1/N est fusionnée avec /main/M à partir de la version de base commune /main/B, les versions extraites des fichiers contiennent une seule ligne qui a été modifiée dans chaque version - un conflit. Et ce conflit doit être résolu manuellement, au lieu d'être géré automatiquement.
Maintenant, le SCCS a des mots-clés d'identification. Les mots-clés ID ont deux formats, l'un pour les fichiers en cours de modification et l'autre pour les fichiers qui ne sont pas en cours de modification :
Edit Non-Edit
%I% 9.13
%E% 06/03/09
%Z% @(#)
%M% s.stderr.c
Si vous tentez une fusion à trois des versions modifiables des fichiers SCCS (avec la notation %x%), il n'y aura pas de conflits sur les lignes contenant des métadonnées, à moins que vous ne modifiiez les métadonnées sur ces lignes (par exemple en passant des dates %D% de style américain aux dates %E% de style britannique - SCCS ne prend pas en charge les dates 2009-03-15 de style ISO en standard).
RCS a également un mécanisme de mots-clés, et les mots-clés ont également deux formats, bien que l'un soit pour les fichiers qui n'ont pas encore été insérés dans RCS et l'autre pour ceux qui l'ont été :
Original After insertion
$Revision$ $Revision: 9.13 $
$Date$ $Date: 2009/03/06 06:52:26 $
$RCSfile$ $RCSfile: stderr.c,v $
La différence est entre un '$' suivant le mot-clé et un ':', un espace, du texte, un espace et enfin un '$'. Je n'ai pas fait assez de fusions avec RCS pour être sûr de ce qu'il fait avec les informations des mots-clés, mais je note que s'il traite les notations étendues et "contractées" comme équivalentes (indépendamment du contenu du matériel étendu), alors la fusion pourrait avoir lieu sans conflit, laissant la notation contractée dans la sortie de la fusion, qui serait correctement étendue lorsque le fichier résultant est récupéré après vérification.
Le problème de ClearCase est l'absence d'un gestionnaire de fusion approprié.
Comme je l'ai indiqué dans ma discussion sur SCCS et RCS, si la fusion à trois est effectuée en traitant les mots-clés dans les formats corrects (contractés ou modifiables), alors il n'y a pas de conflit de fusion.
Le problème avec CC (de ce point de vue - clairement, les implémenteurs de CC ne sont pas d'accord) est qu'il manque un système pour gérer les mots-clés, et donc aussi un gestionnaire de fusion approprié.
S'il y avait un système de gestion des mots-clés et un gestionnaire de fusion approprié, alors.. :
- Le système intègre automatiquement les métadonnées dans les fichiers aux points de repère appropriés.
- Lors de la fusion, le système reconnaîtrait que les lignes avec les marqueurs de métadonnées ne sont pas en conflit, à moins que les marqueurs aient été modifiés différemment - il ignorerait le contenu des métadonnées.
L'inconvénient de cette méthode est qu'elle nécessite soit un outil de différenciation spécial qui reconnaît les marqueurs de métadonnées et les traite de manière particulière, soit que les fichiers fournis à l'outil de différenciation soient canonisés (les marqueurs de métadonnées sont réduits à la forme neutre - $Keyword$ ou %K% en termes RCS et SCCS). Je suis sûr que ce petit travail supplémentaire est la raison pour laquelle il n'est pas supporté, quelque chose que j'ai toujours pensé être à courte vue dans un système aussi puissant. Je n'ai pas d'attachement particulier aux notations RCS ou SCCS - les notations SCCS sont plus faciles à manipuler à certains égards, mais elles sont essentiellement équivalentes - et toute notation équivalente pourrait être utilisée.
Pourquoi je pense toujours que les métadonnées dans le fichier sont bonnes
J'aime avoir les métadonnées dans le code source parce que mon code source (par opposition au code source de mon employeur) est distribué en dehors de l'espace de travail de l'entreprise. aegis du système de contrôle du code source. C'est-à-dire qu'il est principalement open source - je le mets à la disposition de tous et de chacun. Si quelqu'un signale un problème dans un fichier, en particulier dans un fichier qu'il a modifié, je pense qu'il est utile de savoir d'où il est parti, et cela est représenté par les métadonnées originales du fichier source.
Ici, SCCS a un avantage par rapport à RCS : les formes développées des mots-clés SCCS sont indiscernables du texte ordinaire, tandis que les mots-clés RCS continuent à ressembler à des mots-clés, de sorte que si l'autre personne a importé le matériel dans son propre dépôt RCS, ses métadonnées remplacent mes métadonnées, un problème qui ne se produit pas avec SCCS de la même manière (l'autre personne doit faire un travail pour écraser les métadonnées).
Par conséquent, même si quelqu'un prend un morceau de mon code source et le modifie, il y a généralement suffisamment d'étiquettes pour identifier d'où il vient, plutôt que de me laisser spéculer sur la version sur laquelle il est basé. Et cela, à son tour, permet de voir plus facilement quelles parties du problème sont de mon fait et quelles parties sont de leur fait.
En pratique, le fonctionnement de l'open source fait que les gens ne migrent pas le code autant qu'on pourrait le croire. Ils ont tendance à s'en tenir à la version publiée, tout simplement parce que s'écarter est trop coûteux lors de la prochaine version officielle.
Je ne sais pas comment vous êtes censé déterminer la version de base d'un morceau de code source qui provient de votre travail et qui a été révisé depuis. Trouver la version correcte, cependant, semble être la clé pour le faire, et s'il y a des empreintes digitales dans le code, alors cela peut être plus facile.
C'est donc un résumé modéré de la raison pour laquelle j'aime intégrer les informations de version dans les fichiers sources. C'est en grande partie historique - SCCS et RCS le faisaient tous les deux, et j'aimais le fait qu'ils le fassent. C'est peut-être une relique ancienne, quelque chose qui doit être abandonné à l'ère du DVCS. Mais je ne suis pas encore totalement convaincu de cela. Cependant, il faudrait peut-être encore plus d'un essai pour expliquer les tenants et aboutissants de mon mécanisme de gestion des versions pour comprendre pourquoi je fais les choses comme je les fais.
Un aspect du raisonnement est que les fichiers clés, tels que 'stderr.c' et 'stderr.h', sont utilisés par pratiquement tous mes programmes. Lorsque je publie un programme qui les utilise, je m'assure simplement que j'ai la version la plus récente - à moins qu'un changement d'interface ne nécessite une rétroversion. Je n'ai pas eu ce problème depuis un certain temps maintenant (j'ai procédé à un renommage systématique en 2003 ; cela a causé quelques maux de tête transitoires, mais Perl scripts m'a permis de mettre en œuvre le renommage assez facilement). Je ne sais pas combien de programmes utilisent ce code - quelque part entre 100 et 200 serait une estimation juste. L'ensemble des changements de cette année (la série des versions 9.x) est encore quelque peu spéculatif ; je n'ai pas encore décidé s'il fallait les conserver. Ils sont également internes à l'implémentation et n'affectent pas l'interface externe, donc je n'ai pas à me décider tout de suite. Je ne suis pas sûr de savoir comment gérer cela en utilisant git. Je ne veux pas intégrer le code de la bibliothèque dans une bibliothèque qui doit être installée avant que vous puissiez construire mon logiciel - c'est trop onéreux pour mes clients. Ainsi, chaque programme continuera à être distribué avec une copie du code de la bibliothèque (une autre sorte de fardeau), mais seulement le code de la bibliothèque dont le programme a besoin, pas toute la bibliothèque. Et je choisis pour chaque programme les fonctions de la bibliothèque qui sont utilisées. Ainsi, je n'exporterais pas un sous-arbre entier ; en effet, le commit qui a couvert les derniers changements dans le code de la bibliothèque n'est généralement pas du tout lié au commit qui a couvert les derniers changements dans le programme. Je ne suis même pas sûr que git doive utiliser un dépôt pour la bibliothèque et un autre pour les programmes qui l'utilisent, ou un dépôt commun plus large. Et je ne migrerais pas vers git avant d'avoir compris cela.
OK - assez de bavardages. Ce que j'ai fonctionne pour moi ; ce n'est pas nécessairement pour tout le monde. Il n'impose pas de demandes extraordinaires au VCS - mais il nécessite des métadonnées de version intégrées dans les fichiers, et CC, Git et (je pense) SVN ont des problèmes avec cela. Cela signifie probablement que c'est moi qui ai des problèmes - des blocages pour un passé perdu. Mais j'apprécie ce que le passé a à offrir. (Je peux m'en tirer parce que la plupart de mon code n'est pas ramifié. Je ne suis pas sûr de la différence qu'apporterait le branchement).
2 votes
À tout modérateur, s'il vous plaît ne supprimez pas cette question (s'il vous plaît). Je comprends que cela ne correspond pas aux normes actuelles de SO, mais cela représente 12 années d'expérience sur cet outil (ClearCase) et devrait apporter une valeur ajoutée durable pour les pauvres âmes coincées avec ce système de contrôle de version.