Question

Le concept de branchement basé sur la subversion semble être axé sur la création d’un fork [non] stable de tout le référentiel sur lequel effectuer le développement. Existe-t-il un mécanisme permettant de créer des branches de fichiers individuels?

Pour un cas d'utilisation, imaginez un fichier d'en-tête commun (* .h) comportant plusieurs implémentations de source (* .c) spécifiques à la plate-forme. Ce type de branche est permanent. Toutes ces succursales connaîtront un développement en cours avec des fusions occasionnelles entre branches. Cela contraste fortement avec les branches à développement instable / à libération stable qui ont généralement une durée de vie limitée.

Je ne souhaite pas créer de branche (tout ou partie du référentiel) dans le référentiel, car cela créerait une quantité de maintenance déraisonnable permettant une fusion continue entre le tronc et toutes les branches. À l’heure actuelle, j’utilise ClearCase, qui a un concept différent de branchement qui facilite cette opération. On m'a demandé d'envisager la transition vers le SVN, mais cette différence de paradigme est importante. Je suis beaucoup plus préoccupé par la possibilité de créer facilement des versions alternatives pour des fichiers individuels que par des choses comme couper une branche de version stable.

Était-ce utile?

La solution

Malheureusement, je pense que la vraie réponse est que ClearCase gère cette situation beaucoup mieux que Subversion. Avec Subversion, vous devez créer une branche tout , mais ClearCase autorise une sorte de "branche paresseuse". idée qui signifie que seul un certain groupe de fichiers sont branchés, les autres suivent toujours le tronc (ou la branche que vous spécifiez).

Les autres solutions fournies ici ne fonctionnent pas vraiment comme vous le souhaitez, elles ne font que copier le fichier dans un chemin différent. Maintenant, vous devez faire des choses étranges pour utiliser réellement ce fichier.

Euh, désolé. Ce n'était pas vraiment une très bonne réponse. Mais il n’ya pas de bonne solution à cela avec Subversion. Son modèle est branche et fusion.

Éditer: OK, développons donc ce que crashmstr a dit. Vous pouvez faire ceci:

svn cp $REP/trunk/file.h $REP/branched_files/file.h
svn co $REP/trunk
svn switch $REP/branched_files/file.h file.h

Mais wow !, est-ce sujet aux erreurs. Chaque fois que vous faites un virage, vous verrez ceci:

svn st
    S  file.h

Un peu bruyant ça. Et lorsque vous souhaitez créer une branche de quelques fichiers ou modules dans un référentiel source volumineux, le processus devient très confus.

En fait, il y a probablement un projet décent ici pour simuler quelque chose comme les fichiers à branches de ClearCase avec les propriétés svn et le basculement, écrire un wrapper autour du client standard svn pour faire face à tous les dégâts.

Autres conseils

Il n'est pas nécessaire de créer une branche pour l'ensemble du référentiel. Vous pouvez créer des branches de dossiers dans votre projet (par exemple, un dossier d'inclusion). Comme d'autres l'ont déjà noté, vous pouvez également effectuer une "copie". d'un seul fichier. Une fois que vous avez une copie d'un fichier ou d'un dossier, vous effectuez un "basculement". dans le fichier ou le dossier avec une branche pour travailler sur la version de la branche.

Si vous créez un dossier de branches distinct dans le référentiel, vous pouvez y copier vos fichiers avec des commandes via des commandes côté serveur:

svn copy svn://server/project/header.h svn://server/branched_files/header.h

Vous pouvez ensuite utiliser ce fichier pour utiliser le chemin du référentiel branches_fichiers

Voici comment je comprends votre problème. Vous avez l'arbre suivant:

time.h
time.c

et vous devez le refuser pour plusieurs architectures:

time.h is comon
time.c (for x386), time.c (for ia64), time.c (for alpha),...

Également dans votre VCS actuel, vous pouvez le faire en créant autant de branches de time.c que nécessaire et en vérifiant les fichiers du VCS, vous vérifiez automatiquement la dernière heure.h du tronc commun et la dernière heure.c de la branche sur laquelle vous travaillez.

Le problème qui vous préoccupe est que si vous utilisez SVN pour extraire une branche, vous devrez fusionner time.h du tronc très souvent, sinon vous risquez de travailler sur un fichier plus ancien (par rapport au tronc), ce temps supplémentaire. n'est pas acceptable pour vous.

En fonction de la structure de votre code source, il pourrait y avoir une solution. imaginez que vous avez

 
/
/headers/
/headers/test.h
/source/
/source/test.c

Ensuite, vous pouvez créer une branche / et utiliser le svn: externals fonction pour relier vos en-têtes à la tête du coffre. Cela ne fonctionne que sur les répertoires et comporte certaines limitations concernant le retour à test.h (vous devez aller dans le répertoire en-tête pour que cela fonctionne), mais cela pourrait fonctionner.

Une "branche & subversion" est juste une copie de quelque chose dans votre référentiel. Donc, si vous vouliez créer un lien vers un fichier, vous feriez simplement:

svn copy myfile.c myfile_branch.c

Je ne pense pas qu'il soit très utile de créer des branches pour un seul fichier? Il n’ya aucun moyen de le tester avec le code de la ligne réseau?

Vous pouvez utiliser un patch si vous souhaitez annuler les modifications et les appliquer ultérieurement.

Êtes-vous sûr d'avoir vraiment besoin de cette fonctionnalité dans votre VCS ?

Pourquoi ne pas utiliser le préprocesseur C et #ifdef pour éliminer le code dont vous n’avez pas besoin? Ou tout autre outil similaire.

quelque chose comme:

// foo.h:
void Foo();

// foo_win32.c
#ifdef _WIN32
void Foo()
{
   ...
}
#endif

// foo_linux.c
#ifdef _GNUC
void Foo()
{
   ...
}
#endif

Parfois, si cela ne vous convient pas, alors ce n'est pas la bonne solution.

Une branche dans SVN n’est qu’une copie. Je pense que pour le faire comme vous le souhaitez, vous devez placer chaque version du fichier dans un répertoire distinct du référentiel et l'archiver dans votre dossier source. C'EST À DIRE. traiter ce fichier comme un projet séparé.

Une branche dans Subversion est exactement ce dont vous parlez. Tous les fichiers sont une copie exacte du coffre, à l'exception de ceux que vous avez modifiés. C’est la "copie bon marché". méthodologie évoquée dans le livre SVN. Le seul inconvénient est la nécessité de fusionner le tronc de temps en temps dans la branche pour s'assurer que les modifications apportées sont reflétées dans la branche. Bien sûr, si ces modifications ne sont pas souhaitées, aucune fusion de branche > ne doit avoir lieu.

Un moyen simple de permettre la fusion automatique des modifications de lignes réseau (ce qui simule le paradigme Clear Case) consiste à utiliser un script de hook de pré-validation pour fusionner les modifications de lignes antérieures à la validation (en fait, est toujours une bonne stratégie pour empêcher la dérive de code).

Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top