2010-05-26 7 views
1

Nous utilisons svn pour le développement d'une grande application Web, et nous effectuons des mises à jour périodiques de la production. Le serveur de production n'a pas accès à svn (pour des raisons de sécurité).Comment appliquer les modifications sans accès au serveur svn

Quelle est la meilleure façon de pousser les changements depuis la dernière version de production pour une nouvelle version? Nous aimerions éviter de recréer le site entier à chaque fois, car il est très grand.

+0

Je ne comprends pas comment le problème de la libération sur un serveur de production est lié au problème du contrôle de version. Peux-tu élaborer? – cdonner

+0

Pour voir si je comprends. Vous effectuez une mise à jour SVN sur la machine A, puis vous copiez l'intégralité du répertoire du site sur la machine de production. Vous voulez juste copier les choses qui ont changé avec cette mise à jour SVN, évitant ainsi de copier le répertoire entier. Est-ce que c'est ça? –

+0

Si le serveur de production était connecté au serveur svn, nous irions simplement sur le serveur de production et ferions svn update. Mais ce n'est pas connecté. – JoelFan

Répondre

1

Eh bien, laissez-moi tenter votre chance. Vous pouvez analyser la sortie de la commande de mise à jour SVN et générer des instructions de copie qui copient uniquement les fichiers modifiés?

http://svnbook.red-bean.com/en/1.1/ch03s05.html

Examinons la sortie de svn mise à jour un peu plus. Lorsque le serveur envoie des modifications à votre copie de travail, une lettre code est affiché à côté de chaque élément à vous permettra de savoir quelles actions Subversion effectuées pour apporter votre copie de travail mise à jour:

U foo

Fichier foo a été mis à jour (a reçu modifications du serveur).

A foo

foo fichier ou répertoire a été ajouté à votre copie de travail.

D foo

fichier ou répertoire foo a été supprimé de votre copie de travail.

R foo

fichier ou répertoire foo a été replacés dans la copie de travail; que est, foo a été supprimé et un nouvel élément du même nom a été ajouté. Alors que ils peuvent avoir le même nom, le référentiel les considère comme objets distincts avec des historiques distincts .

G foo

fichier foo reçu de nouvelles modifications du référentiel, mais votre copie locale du fichier a vos modifications. Soit les changements ne pas recoupé, ou les changements ont été exactement les mêmes que vos modifications locales, donc Subversion a Fusionné avec succès modifications du référentiel dans le fichier sans problème .

C foo

fichier foo reçu Conflicting modifications du serveur. Les changements du serveur chevauchent directement vos propres modifications au fichier. Pas besoin de paniquer, cependant. Ce chevauchement doit être résolu par un humain (vous); nous discuter de cette situation plus tard dans ce chapitre .

Ou si vous préférez une solution semi-manuelle, vous pouvez utiliser un outil de diff comme WinMerge ou Araxis Merge pour synchroniser les deux répertoires.

EDIT:

Je ne pense pas "svn update" fonctionnera exactement, mais ce que je me suis installé sur était:

  • svn caisse de la révision prod actuel (ancien)
  • svn commutateur à la révision qui est prête pour prod (nouveau)

J'ai écrit un script pour capturer la sortie du "commutateur". Il traduit les opérations U et A en "ajoute" à une archive zip. Il traduit les opérations D pour supprimer les commandes à exécuter sur le serveur de production. Sur le serveur de production, il suffit de décompresser l'archive et d'exécuter les commandes de suppression.

+0

Comment configurer le répertoire de travail avant d'effectuer la mise à jour? – JoelFan

+0

juste 'cd' là et faire' svn update'. $ svn mise à jour A newdir/toggle.c A newdir/disclose.c A newdir/launch.c D newdir/README Mise à jour à la révision 32. –

+0

Il aura aucune mise à jour, car il est le répertoire de développement ! – JoelFan

0

Faites un contrôle sur un répertoire de votre côté de la paroi de verre, rendez-le accessible depuis le serveur de production. Utilisez une sorte d'utilitaire diff/sync pour synchroniser les deux, moins les dossiers _svn ou tout autre fichier qui contemple l'environnement de production.

Ou utilisez un fichier zip (ou autre archive) de fichiers avec "modifications depuis mm/jj/aaaa" et appliquez-le au répertoire de production.

+0

Pouvez-vous fournir plus de détails sur quel utilitaire utiliser? – JoelFan

+0

@Joel Essayez 'rsync' sur unixoids ou' robocopy' sous Windows. Les deux peuvent synchroniser un répertoire à un autre, tout en ne transférant que les fichiers modifiés. –

+0

Unison sur unix est populaire, j'ai essayé de le faire fonctionner une fois ... Je pense qu'il est également disponible pour Windows. Vous pouvez utiliser Unison ou rsync dans CYGWin, je pense. SecondCopy pour Windows. Vous pouvez utiliser BeyondCompare sous Windows, pour le faire manuellement (utile si vous n'êtes pas sûr de savoir ce que vous faites). FileBoss sous Windows. Il y a beaucoup de ces choses. –

Questions connexes