40 votes

La Subversion de mise à jour des alias à une date

Je suis en train de travailler sur un grand projet sous SVN de contrôle. De nombreuses parties de la base de code sont en cours d'archivage en tant que candidat, mais sont activement travaillé par d'autres personnes.
Je voulais mettre à jour l'ensemble de mon travail de copie, externes et tous, de sorte qu'il reflète les différents dépôts de Têtes de à un point spécifique dans le temps. Ma première tentative a été:

svn up -r'{20090324}'

Cette mise à jour du répertoire courant pour la date précise, mais les mises à jour de tous les éléments externes au courant de la date. La mise à jour de la façade, un à un, fonctionne comme prévu.
Je comprends que, en raison de la nature des alias, une seule mise à jour ne pourrais pas travailler avec un numéro de révision, mais pourquoi ne pas travailler avec une date?
Quelle est la meilleure façon d'atteindre le point-à-temps d'effet que je recherche, sans avoir à maintenir un script qui dur-codes différents externes?

Je suis en cours d'exécution d'un système Linux.

42voto

Dave Cohen Points 705

C'est inefficace, qu'il appelle svn update le plus souvent (généralement) requis. Sinon, il est court, un doux:

trouver . -nom .svn -execdir svn update -r {2010-08-30} \;

9voto

Brian Campbell Points 101107

Lors de l'utilisation de svn:externals, il est généralement une mauvaise idée d'utiliser un externe sans un numéro de révision. Cela signifie qu'il devient difficile de corréler la version de l'externe avec la version de l'contenant du projet; je sais que cela à la dure, de tenter de retrouver une partie de l'histoire, dans un projet de contenus externes, et j'aurais à vous de deviner lequel de révision correspond à la révision dans le contenant de projet (parfois c'était plus tôt parce que quelqu'un avait mis à jour le projet externe et ensuite mis à jour le contenant de projet, parfois, il était plus tard, parce que quelqu'un avait modifié des fichiers directement à l'extérieur de la caisse, puis validé).

Au lieu de cela, comme l'a suggéré le conseil de la boîte de quelques paragraphes dans les externes de la section dans le livre de subversion, vous devriez toujours s'engager que d'apparence avec un numéro de révision. De cette façon, chaque fois que vous découvrez une révision particulière de l'contenant du projet, une révision de l'externe sera également vérifié. Cela signifie un peu plus de travail, que vous devez mettre à jour le numéro de révision dans la propriété svn:externals à chaque fois (nous avons écrit un script pour le faire automatiquement), mais dans le long terme, il est une bien meilleure solution.

edit: Voici le squelette du script que nous avons utilisé (une tâche rake) pratique pour la mise à jour de l'externe et de préserver la synchronisation.

desc 'Update external for this project (rake update_external r=17789)'
task :update_external do |t|
  rev = ENV['r']
  rev =~ /^\d+$/ or raise "Invalid SVN revision number: r=<#{rev}>"

  # Update the project.
  sh "svn update"

  URL = 'svn+ssh://example.com/external/trunk'
  sh "svn propset svn:externals 'external -r#{rev} #{URL}' containing/directory"

  # Update again -- to put the externals back to the right revision.
  sh "svn update"
end

3voto

Artem Russakovskii Points 7341

C' est la meilleure solution pour le problème que j'ai trouvé à ce jour (c'est un problème difficile - de subversions devs devrait résoudre le problème dans le noyau). Cet exemple traite avec mplayer en particulier, mais vous devriez facilement voir la logique.

; fetch the rev I want without including the externals
svn checkout -r "$REV" --ignore-externals \
    svn://svn.mplayerhq.hu/mplayer/trunk

; grab the date of that rev from the svn info output
DATE=`svn info trunk|sed -n '/^Last Changed Date/s/.*: \(.*\) (.*/\1/p'`

; fetch the externals using that date
svn checkout -r "{$DATE}" \
        svn://svn.mplayerhq.hu/ffmpeg/trunk/libavutil \
        svn://svn.mplayerhq.hu/ffmpeg/trunk/libavformat \
        svn://svn.mplayerhq.hu/ffmpeg/trunk/libavcodec \
        svn://svn.mplayerhq.hu/ffmpeg/trunk/libpostproc

2voto

Whatsit Points 3292

Je n'ai toujours pas obtenu une solution parfaite, mais celui-ci vient de fermer:

svn propget svn:externals | sed -e 's/ .*$//g' | xargs svn up -r'{20090324}'

Cela fonctionne dans mon cas, car il n'y a pas récursive externes, et tous les alias sont définis sans espaces dans le répertoire ou un numéro de révision, de sorte que l'expression régulière peut facilement couper la fuite du chemin du référentiel.

Je suis sûr qu'il y a de mieux regex qui va résoudre le problème de façon générique, bien que.

Edit: en Fait, plus j'y pense, plus les problèmes que je vois. Le plus important, c'est que c'est à l'aide de la propriété svn:externals de l' actuelle version, plutôt que la propriété svn:externals de la version à la date spécifiée. C'est d'autant plus complexe que je ne le pensais.

1voto

Jim T Points 7998

C'est délicat, et je crains que je ne peux pas offrir une bonne solution à votre situation actuelle - mais Brian a donné la réponse sur la façon de l'éviter.

La prévention se résume à un peu de dépôt de la théorie - fondamentalement, il ne doit pas être possible de modifier le code source de votre projet sans une révision correspondante figurant dans le coffre.

En pointant toutes externes des balises ou des révisions spécifiques, aucune modification ne peut apparaître dans le projet principal de l'histoire sans pour autant commettre un changement de la référence externe. Mais si vous pointez un externe à un mouvement du tronc, un changement pour les externes n'apparaissent pas dans le projet principal du scénario tout en vous laissant dans la position que vous êtes en.

Personnellement, j'ai pris le point de vue que les externes doivent être traitées et rejetées comme des projets indépendants, par conséquent, toutes les références externes point de balises. Lors de fortes développement parallèle, c'est bien d'un interrupteur externe du tronc, ou d'avoir de l'instabilité de la direction du développement temporairement pointant vers un externe du tronc, mais le projet principal tronc toujours des points de la stabilité externe, et c'est une décision consciente de mise à niveau. Ce point de vue peut-être exagéré pour votre situation, mais il vaut la peine de voir d'autres possibilités.

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X