web-dev-qa-db-fra.com

Un référentiel SVN ou plusieurs?

Si vous avez plusieurs projets non liés, est-ce une bonne idée de les mettre dans le même référentiel?

myRepo/projectA/trunk
myRepo/projectA/tags
myRepo/projectA/branches
myRepo/projectB/trunk
myRepo/projectB/tags
myRepo/projectB/branches

ou voudriez-vous créer de nouveaux référentiels pour chacun?

myRepoA/trunk
myRepoA/tags
myRepoA/branches
myRepoB/trunk
myRepoB/tags
myRepoB/branches

Quels sont les avantages et les inconvénients de chacun? Tout ce que je peux penser actuellement, c'est que vous obtenez des numéros de révision mixtes (et alors?), Et que vous ne pouvez pas utiliser svn:externals sauf si le référentiel est réellement externe. (je pense?)

La raison pour laquelle je demande, c'est parce que j'envisage de consolider mes multiples référentiels en un seul, car mon hôte SVN a commencé à facturer par dépôt.

103
nickf

Le problème unique ou multiple se résume à une préférence personnelle ou organisationnelle.

La gestion du multiple et du simple se résume principalement au contrôle d'accès et à la maintenance.

Le contrôle d'accès pour un référentiel unique peut être contenu dans un seul fichier; Plusieurs référentiels peuvent nécessiter plusieurs fichiers. La maintenance a des problèmes similaires - une grosse sauvegarde ou beaucoup de petites sauvegardes.

Je gère le mien. Il y a un référentiel, plusieurs projets, chacun avec ses propres balises, tronc et branches. Si l'un devient trop gros ou si j'ai besoin d'isoler physiquement le code d'un client pour son confort, je peux créer rapidement et facilement un nouveau référentiel.

J'ai récemment consulté une entreprise relativement importante sur la migration de plusieurs systèmes de contrôle de code source vers Subversion. Ils ont environ 50 projets, allant de très petites applications d'entreprise à leur site Web d'entreprise. Leur plan? Commencez avec un seul référentiel, migrez vers plusieurs si nécessaire. La migration est presque terminée et ils sont toujours sur un référentiel unique, aucune plainte ou problème n'a été signalé car il s'agit d'un référentiel unique.

Ce n'est pas un problème binaire, noir et blanc.

Faites ce qui fonctionne pour vous - si j'étais à votre place, je combinerais les projets en un seul référentiel aussi rapidement car je pouvais taper les commandes, car le coût serait une considération majeure dans mon (très, très petite) entreprise.

JFTR:

numéros de révision dans Subversion n'a vraiment aucune signification en dehors du référentiel. Si vous avez besoin de noms significatifs pour une révision, créez un TAG

Les messages de validation sont facilement filtrés par chemin dans le référentiel, donc lire uniquement ceux liés à un projet particulier est un exercice trivial.


Edit: Voir la réponse de Blade pour plus de détails sur l'utilisation d'une configuration d'autorisation/d'authentification unique pour SVN.

75
Ken Gentle

Pour votre cas spécifique, un (1) référentiel est parfait. Vous économiserez beaucoup d'argent. J'encourage toujours les gens à utiliser un seul référentiel. Parce qu'il est similaire à un seul système de fichiers: C'est plus facile

  • Vous aurez un seul endroit où vous recherchez du code
  • Vous aurez une seule autorisation
  • Vous aurez un seul numéro de commit (jamais essayé de construire un projet qui est réparti sur 3 repos?)
  • Vous pouvez mieux réutiliser les bibliothèques communes et suivre vos progrès dans ces bibliothèques (svn: les externes sont PITA et ne résoudront pas tous les problèmes)
  • Les projets planifiés comme des éléments entièrement différents peuvent grandir ensemble et partager des fonctions et des interfaces. Cela sera très difficile à réaliser dans plusieurs référentiels.

Il y a un point unique pour plusieurs référentiels: l'administration d'énormes référentiels est inconfortable. Le vidage/chargement d'énormes dépôts prend beaucoup de temps. Mais comme vous ne faites aucune administration, je pense que ce ne sera pas votre souci;)

SVN évolue très bien avec des référentiels plus importants, il n'y a pas de ralentissement même sur des référentiels énormes (> 100 Go).

Vous aurez donc moins de soucis avec un seul référentiel. Mais vous devriez vraiment penser à la mise en page du repo!

25
Peter Parker

J'utiliserais plusieurs référentiels. En plus du problème d'accès utilisateur, cela facilite également la sauvegarde et la restauration. Et si vous vous retrouvez dans une position où quelqu'un veut vous payer pour votre code (et son historique), il est plus facile de leur donner juste un vidage de référentiel.

Je dirais que la consolidation des référentiels juste à cause des politiques de facturation de votre hébergeur n'est pas une très bonne raison.

7
Greg Hewgill

Nous utilisons un référentiel unique. Ma seule préoccupation était l'échelle, mais après avoir vu référentiel ASF (700k révisions et comptage) j'étais assez convaincu que les performances ne seraient pas un problème.

Nos projets sont tous liés, différents modules de verrouillage qui forment un ensemble de dépendances pour une application donnée. Pour cette raison, un référentiel unique est idéal. Vous pouvez souhaiter des troncs/branches/balises séparés pour chaque projet, mais vous pouvez toujours valider atomiquement une modification sur l'ensemble de votre base de code dans une seule révision. C'est génial pour le refactoring.

7
Mark Renouf

Sachez que lorsque vous prenez votre décision, de nombreux référentiels SVN peuvent partager le même fichier de configuration.

Exemple (tiré du lien ci-dessus):

En coquille:

$ svn-admin create /var/svn/repos1
$ svn-admin create /var/svn/repos2
$ svn-admin create /var/svn/repos3

Fichier: /var/svn/repos1/conf/svnserve.conf

[general]
anon-access = none # or read or write
auth-access = write
password-db = /var/svn/conf/passwd
authz-db = /var/svn/conf/authz
realm = Repos1 SVN Repository

Fichier:/var/svn/conf/authz

[groups]
group_repos1_read = user1, user2
group_repos1_write = user3, user4
group_repos2_read = user1, user4

### Global Right for all repositories ###
[/]
### Could be a superadmin or something else ###
user5 = rw

### Global Rights for one repository (e.g. repos1) ###
[repos1:/]
@group_repos1_read = r
@group_repos1_write = rw

### Repository folder specific rights (e.g. the trunk folder) ###
[repos1:/trunk]
user1 = rw

### And soon for the other repositories ###
[repos2:/]
@group_repos2_read = r
user3 = rw
6
Frederic Morin

Je créerais référentiels séparés ... Pourquoi? Les numéros de révision et les messages de validation n'auront tout simplement aucun sens si vous avez beaucoup de projets non liés dans un seul référentiel, ce sera à coup sûr un gros gâchis à court terme ....

5
CMS

Nous sommes une petite société de logiciels et nous utilisons un seul référentiel pour l'ensemble de notre développement. L'arbre ressemble à ceci:

/client/<clientname>/<project>/<trunk, branches, tags>

L'idée était que nous aurions le travail client et interne dans le même repo, mais nous avons fini par avoir notre entreprise comme un "client" d'elle-même.

Cela a très bien fonctionné pour nous, et nous utilisons Trac pour l'interfacer. Les numéros de révision sont sur l'ensemble du référentiel et ne sont pas spécifiques à un projet, mais cela ne nous met pas en phase.

5
mlambie

Personnellement, je créerais de nouveaux référentiels pour chacun. Il simplifie considérablement le processus de vérification et facilite l'administration dans son ensemble, du moins en ce qui concerne l'accès des utilisateurs et les sauvegardes. En outre, cela évite le problème du numéro de version global, donc le numéro de version est significatif sur tous les projets.

Vraiment cependant, vous devriez simplement utiliser git;)

4
Paul Wicks

une autre chose à considérer est le fait que l'utilisation de plusieurs référentiels vous fait perdre la possibilité d'avoir une journalisation unifiée (commande svn log), cela seul sera une bonne raison de choisir un référentiel unique.

J'utilise TortuiseSvn et j'ai constaté que l'option "Afficher le journal" est un outil obligatoire. bien que vos projets ne soient pas liés, je suis sûr que vous constaterez qu'il est toujours utile d'avoir une information globale centralisée sur les projets croisés (chemins d'accès, identifiants de bogue, messages, etc.).

3
ofer

Semblable à la suggestion de Blade sur le partage de fichiers, voici une solution légèrement plus facile, mais moins flexible. J'ai configuré le nôtre comme ceci:

  • / var/svn /
  • / var/svn/bin
  • / var/svn/repository_files
  • / var/svn/svnroot
  • / var/svn/svnroot/repos1
  • / var/svn/svnroot/repos2
  • ...

Dans "bin", je garde un script appelé svn-create.sh qui fera tout le travail de configuration de la création d'un référentiel vide. J'y garde également le script de sauvegarde.

Dans "repository_files", je garde les répertoires communs "conf" et "hooks" vers lesquels tous les référentiels ont des liens sym. Ensuite, il n'y a qu'un seul ensemble de fichiers. Cela élimine la possibilité d'avoir un accès granulaire par projet sans rompre les liens. Ce n'était pas une préoccupation où j'ai mis cela en place.

Enfin, je garde le répertoire principal/var/svn sous contrôle de source en ignorant tout dans svnroot. De cette façon, les fichiers et les scripts du référentiel sont également sous contrôle de source.

#!/bin/bash

# Usage:
# svn-create.sh repository_name

# This will:
# - create a new repository
# - link the necessary commit scripts
# - setup permissions
# - create and commit the initial directory structure
# - clean up after itself

if [ "empty" = ${1}"empty" ] ; then
  echo "Usage:"
  echo "    ${0} repository_name"
  exit
fi

SVN_HOME=/svn
SVN_ROOT=${SVN_HOME}/svnroot
SVN_COMMON_FILES=${SVN_HOME}/repository_files
NEW_DIR=${SVN_ROOT}/${1}
TMP_DIR=/tmp/${1}_$$

echo "Creating repository: ${1}"

# Create the repository
svnadmin create ${NEW_DIR}

# Copy/Link the hook scripts
cd ${NEW_DIR}
rm -rf hooks
ln -s ${SVN_COMMON_FILES}/hooks hooks

# Setup the user configuration
cd ${NEW_DIR}
rm -rf conf
ln -s ${SVN_COMMON_FILES}/conf conf

# Checkout the newly created project
svn co file://${NEW_DIR} ${TMP_DIR}

# Create the initial directory structure
cd ${TMP_DIR}
mkdir trunk
mkdir tags
mkdir branches

# Schedule the directories addition to the repository
svn add trunk tags branches

# Check in the changes
svn ci -m "Initial Setup"

# Delete the temporary working copy
cd /
rm -rf ${TMP_DIR}

# That's it!
echo "Repository ${1} created. (most likely)"
2
Harvey

Si vous envisagez ou utilisez un outil comme trac qui s'intègre à SVN, il est plus judicieux d'utiliser un dépôt par projet.

2
Frederic Morin

Ma suggestion en est une. Sauf si vous avez différents utilisateurs accédant à chacun, alors je dirais utiliser plusieurs.

Mais encore une fois, même ce n'est pas une bonne raison d'utiliser plusieurs.

1
Levi Rosol

Semblable à mlambie d'utiliser un seul dépôt, mais est allé un peu plus loin avec la structure de dossiers pour zoomer facilement sur un type particulier de projets - projets basés sur le Web HTML vs cs (C #) vs sql (scripts de création/exécution SQL) vs xyz ( Langages spécifiques au domaine comme afl (AmiBroker Formula Language) ou ts (TradeStation)):

/<src|lib>/<app-settings|afl|cs|js|iphone|sql|ts|web>/<ClientName>/<ProjectName>/<branches|tags>

Remarque, j'ai le tronc en direct dans les branches car je le traite comme la branche par défaut. La seule difficulté est parfois lorsque vous souhaitez créer rapidement un autre projet dont vous avez besoin pour construire la structure ProjectName/branches | tags. J'utilise les paramètres d'application simplement comme emplacement pour conserver des fichiers de paramètres d'applications spécifiques dans le référentiel si facilement partageables avec d'autres (et remplacer ClientName par VendorName et ProjectName par AppName dans cette structure de dossiers; et les branches | tags peuvent être utiles pour baliser les paramètres sur différents principaux versions des produits des fournisseurs également).

Bienvenue à tous les commentaires sur ma structure - je l'ai récemment changé en ceci et jusqu'à présent assez content, mais je trouve parfois difficile de maintenir les structures branches | tags par projet - en particulier si le projet est simplement une configuration de projet simplement pour tester un autre projet.

1
J.D.