41 votes

Comment diviser un dossier SVN en son propre dépôt lorsqu'il a été renommé ?

Je veux diviser un répertoire d'un grand dépôt Subversion en un dépôt à part entière, et conserver l'historique des fichiers dans ce répertoire.

J'ai d'abord essayé de le faire de la manière habituelle

svnadmin dump /path/to/repo > largerepo.dump
cat largerepo.dump | svndumpfilter include my/directory >mydir.dump

mais cela ne fonctionne pas, car le répertoire a été déplacé et copié au fil des ans et les fichiers ont été déplacés vers d'autres parties du référentiel. Le résultat est un grand nombre de ceux-ci :

svndumpfilter: Invalid copy source path '/some/old/path'

La prochaine chose que j'ai essayé est d'inclure ces /some/old/path au fur et à mesure qu'ils apparaissent et après une longue, longue liste de fichiers et de répertoires inclus, le svndumpfilter se termine, MAIS l'importation du dump résultant ne produit pas les mêmes fichiers que ceux du répertoire courant.

Alors, comment puis-je séparer correctement le répertoire de ce dépôt tout en conservant l'historique ?

EDIT : Je veux spécifiquement trunk/myproj pour être le tronc dans un nouveau dépôt PLUS que le nouveau dépôt n'inclue aucun des autres anciens éléments, c'est-à-dire qu'il ne devrait pas y avoir la possibilité pour quiconque de mettre à jour l'ancienne révision avant la séparation et d'obtenir/voir les fichiers.

La solution svndumpfilter que j'ai essayée aurait permis d'obtenir exactement cela, malheureusement ce n'est pas faisable puisque les chemins/fichiers ont été déplacés. Le site solution par ng n'est pas acceptable puisque c'est essentiellement un clone + suppression des extras qui conserve TOUT l'historique, pas seulement l'historique pertinent de myproj.

0voto

next2you Points 1

Je viens de rencontrer ce problème et j'ai écrit un petit script pour réessayer le dumping jusqu'à ce que tous les chemins source invalides soient résolus.

#!/usr/bin/env ruby

require 'open3'
include Open3

paths = [ "/your/path" ]
command = ""

new_path = "xx"
while (! new_path.nil?)
lines = nil
popen3(" svndumpfilter include #{paths.join(' ')} > svn.result.dump < svn.original.dump") do |i, o, err|
  i.close
  puts "Processing, please wait ..."
  lines = err.readlines
end

 new_path = nil
 lines.each do |line|
  if line =~ /Invalid copy source path '(.*)'/
    new_path = $1
  end
 end
 puts "Adding #{new_path}"
 paths << new_path
end

0voto

Nux Points 1053

Basé sur la réponse de ng., mais avec filtrage et suppression des révisions vides.

Étape 1. Vider et filtrer :

svnadmin dump /path/to/repository > fulldumpfile
svndumpfilter include trunk/the/part/you/want --drop-empty-revs --renumber-revs < fulldumpfile > dumpfile

Étape 2. Créer un nouveau repo. (notez que cela peut aussi être fait par exemple avec Tortoise SVN)

svnadmin create /path/to/new_repo

N'oubliez pas d'ajouter tout ce dont vous avez besoin pour pouvoir passer à la caisse (autorisations, etc.).

Étape 3. Extraire et ajouter le dossier de base (peut aussi être fait par exemple avec Tortoise SVN)

svn checkout http://localhost/new_repo /some/checkout/path/newrepo
cd /some/checkout/path/newrepo
# to be able to create "trunk/the/part/you/want" you will need to add parent dir:
mkdir -p trunk/the/part/you
svn add trunk
svn commit -m "old base"

Étape 4. Chargement de la décharge filtrée

svnadmin load /path/to/new_repo < dumpfile

Étape 5. Déplacer l'ancienne racine vers la nouvelle (peut aussi être fait par exemple avec Tortoise SVN)

cd /some/checkout/path/newrepo
svn update
svn move trunk/the/part/you/want/* trunk/
svn move tags/the/part/you/want/* tags/
svn move branches/the/part/you/want/* branches/
svn commit -m "re-structure base"

Vous devriez maintenant avoir la partie que vous voulez de l'ancien référentiel comme tronc du nouveau.

0voto

triadiktyo Points 424

Nous avons développé Lotissement un outil GUI conçu pour diviser les dépôts svn.

La subdivision analyse le référentiel et calcule l'historique des fichiers au fur et à mesure qu'ils sont copiés et déplacés dans le référentiel. Grâce à ces informations, vos sélections sont intelligemment augmentées pour éviter toutes les erreurs "Chemin source de copie non valide".

En plus de diviser un référentiel, Subdivision peut être utilisé pour supprimer des fichiers d'un référentiel ainsi que pour extraire des fichiers et des dossiers dans un nouveau référentiel.

La subdivision est gratuite pour les petits dépôts.

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