2009-10-27 10 views
32

Ma situation est qu'un tas de fichiers sont vérifiés dans svn qui sont très ennuyeux d'avoir sous contrôle de source (en particulier un fichier log4j.properties), et je voudrais les retirer du contrôle de version. Je sais déjà comment supprimer un fichier de svn version control dans ma propre copie de travail locale, comme dans this question et this one, mais ce n'est pas exactement ce que je cherche.Comment supprimer un fichier de svn versioning sans le supprimer de chaque copie de travail?

Le problème est qu'une fois que je supprime le fichier avec svn rm --keep-local, lorsque tous les autres utilisateurs tirent du référentiel, leurs copies locales de log4j.properties disparaissent et leurs environnements se bloquent. Ce que je veux faire est de supprimer le fichier du contrôle de version dans le référentiel, mais aussi faire en sorte que lorsque tout le monde tire du dépôt, il sera comme si ils avaient utilisé --keep-local sur leurs propres machines, de sorte que la copie existante de leur Le fichier log4j.properties reste dans le fichier mais devient non versionné.

Est-ce encore possible? Je suppose que c'est une fonctionnalité que svn n'a tout simplement pas.

+1

Ceci est une contradiction. Si un fichier est une partie obligatoire du projet - si ce n'est pas le cas, pourquoi le supprimer ferait-il planter l'environnement de n'importe qui? - Il appartient au contrôle de la source. –

+2

Ce n'est pas que le fichier n'est pas requis, il s'agit plus d'un artefact de déploiement qui ne sera pas le même d'un utilisateur à l'autre - par exemple, un des fichiers contient un tas de chemins vers les répertoires. Nous avons déjà des exemples de fichiers comme dans la réponse de Don Kirkby ci-dessous. –

Répondre

8

Si vous avez vraiment beaucoup de ces fichiers, vous pouvez tuer deux oiseaux d'une pierre en utilisant une opération svndumpfilter. L'idée est de faire un vidage du référentiel sur le serveur, de filtrer les fichiers que vous ne voulez pas conserver et de charger le résultat dans un nouveau référentiel. Ensuite, vous mettez le nouveau à la place de l'ancien.

Ceci doit être fait avec précaution, lorsque les utilisateurs n'accèdent pas au référentiel de façon évidente. Mais il va effectivement supprimer les fichiers (intéressant quand ils sont gros) au lieu de les garder dans l'histoire. Comme un effet secondaire, la prochaine fois qu'un utilisateur effectue une mise à jour, ces fichiers seront ignorés comme s'ils n'étaient jamais dans le référentiel. Nous avons dû le faire quelques fois pour supprimer les binaires qui n'y avaient pas leur place.

Link to the related documentation.

exemple simple (la commande offre plus de flexibilité bien sûr):

svnadmin create repos_new 
svnadmin dump repos | svndumpfilter exclude trunk/log4j.properties | svnadmin load repos_new 

Depuis qu'il touche au référentiel sur le serveur, je veux souligner à nouveau que vous devez prendre des précautions (garder votre ancien référentiel). Pour les fichiers pas si ennuyeux, la méthode proposée par Don est moins drastique et préférable. Pour éviter ce genre de situation, vous pouvez définir les propriétés svn:ignore correspondantes dans les répertoires, vous pouvez également encourager les utilisateurs à utiliser des ignorés globaux (ils doivent être définis sur chaque client, malheureusement), ou même utiliser les hook-scripts refuser de manière préventive des catégories de fichiers.

+1

Bonne sauce. Cela semble beaucoup de travail, et dangereux pour démarrer (en outre, je n'ai pas accès shell au référentiel). Mais cela semble être une solution. –

+1

La quantité de travail indique principalement quels fichiers à exclure, vous pouvez le faire en plusieurs étapes comme mieux expliqué dans le lien. La bonne nouvelle est que vous ne toucherez pas le référentiel d'origine, dans le pire des cas, vous devrez simplement recréer le nouveau. Déplacez l'original ailleurs, renommez le nouveau comme original, vérifiez que tout va bien et que vous avez terminé :-) – RedGlyph

7

Ce que je fais habituellement dans des situations similaires est de renommer la copie de dépôt de log4j.properties à log4j.properties.template ou log4j.properties.default, et j'ajouter à la liste log4j.propertiessvn:ignore. Ensuite, chaque utilisateur doit copier ce fichier à log4j.properties dans sa copie de travail. Pour le rendre un peu plus convivial, vous pouvez mettre un chèque dans votre script de construction qui imprime un message de rappel s'il ne trouve pas la copie locale.

+0

Nous avons en fait quelque chose de très similaire pour beaucoup de ces fichiers, et une partie de la rotation d'un nouvel environnement implique la copie de ces fichiers. Mais je ne veux pas obliger tout le monde à copier à nouveau les fichiers que je supprime de svn. –

+2

@Tim: parfois en croissance nécessite un peu de douleur. – NotMe

+1

Cependant, l'idée de script de construction est intrigante - je suppose que je pourrais écrire un script qui copiait automatiquement les fichiers d'exemple sur les fichiers réels s'ils n'existaient pas, puis juste pour cela et nuked les copies existantes du référentiel. Mais c'est une question différente ... –

14

Le secret est de s'assurer que c'est sur la liste d'ignorés avant que vous validez la suppression. Si vous le faites dans cet ordre, la suppression ne se propagera pas aux copies de travail des autres.

Nous utilisons encore svn 1.4, donc l'option --keep-local n'est pas disponible. Mais vous pouvez obtenir la même chose en la supprimant en utilisant un chemin de serveur et un message de validation -m.Dans mon exemple, j'ai accidentellement commis un répertoire appelé nbproject. C'est là que le projet de développement de l'IDE que nous utilisons (NetBeans). Je ne voulais pas supprimer cela des copies de travail de tout le monde ou ils perdraient tous leurs paramètres! Mais cela a fait l'affaire. À partir du répertoire parent:

$ cd trunk 
$ svn propedit svn:ignore . 

apporte jusqu'à $ EDITOR

ajouter nbproject sur sa propre ligne et enregistrer

$ svn commit -m 'Ignore nbproject' 
$ svn rm https://.../trunk/nbproject -m 'Remove nbproject from svn' 
+3

En fait, cela ne fonctionne pas. La suppression est toujours propagée. :( –

+1

Peut-être que les gens ont besoin de mettre à jour seulement ignorer les paramètres avant tout le reste? – tgkprog

-2
svn delete --keep-local <PATH> 

fera

+4

Vous ne comprenez pas la question? Il demande s'il existe une alternative à 'svn delete --keep-local' qui ne supprime pas les fichiers des répertoires de travail des gens , supprimez-les simplement du contrôle de révision, donc 'svn delete --keep-local' ne le fera pas. –

Questions connexes