Comment identifier et supprimer potentiellement grands commits binaires dans un dépôt SVN?

StackOverflow https://stackoverflow.com/questions/2176803

  •  24-09-2019
  •  | 
  •  

Question

Je travaille avec un dépôt SVN qui est plus de 3 ans, contient plus de 6.100 commits et plus de 1,5 Go. Je veux réduire la taille du dépôt SVN (je ne parle pas de la taille d'une exportation SVN complète - je veux dire le dépôt complet, tel qu'il existerait sur le serveur). Avant de le déplacer vers un nouveau serveur

Le dépôt actuel contient le code source pour tous nos projets logiciels, mais il contient également des fichiers binaires relativement importants sans importance tels que:

  • installateurs complets pour un certain nombre d'outils 3ème partie.
  • .jpg et .png (qui sont les exportations non modifiées de PSDs qui vivent dans le même dossier).
  • Bin et les dossiers OBJ (qui sont ensuite «svn ignorées du prochain commit).
  • répertoires ReSharper.

Un certain nombre de ces gros fichiers ont été « SVN supprimé », car ils ont été ajoutés, ce qui crée un nouveau problème de identifing les plus grands délinquants.

Je veux soit:

  • Créer un nouveau dépôt SVN qui contient uniquement le code pour tous les projets logiciels -. Il est vraiment important que les fichiers copiés conservent leur histoire SVN de l'ancien référentiel
  • Retirez les grands commits binaires et des fichiers à partir du référentiel existant.

sont l'une de ces possibles?

Était-ce utile?

La solution

Vous devrez utiliser svnadmin décharge pour obtenir un fichier de vidage de votre référentiel actuel et peut-être svndumpfilter pour traiter le fichier de vidage. Vous pouvez également modifier manuellement le dumpfile aussi longtemps que vous êtes très vigilant.

Il ne va probablement pas être un travail rapide et facile, mais il peut être fait. Je l'ai fait quelque chose de similaire, pour un dépôt beaucoup plus petit. J'ai eu une prise en pension avec environ 150 révisions qui ont eu à propos de 600MB.

Faire un vidage de votre référentiel actuel, apportez les modifications nécessaires et essayer de charger le dumpfile modifié dans un nouveau référentiel. Ensuite, vérifiez le nouveau référentiel pour vous assurer que tout est encore fait sens (l'histoire est toujours correcte, pas de changement dans les chemins étranges, ...).

Autres conseils

Otherside a raison svnadmin dump, etc. Quelque chose comme cela, vous obtiendrez un pointeur rugueux à des révisions qui a ajouté beaucoup de données à votre prise en pension, et sont candidats à svndumpfilter:

for r in `svn log -q | grep ^r | cut -d ' ' -f 1 | tr -d r`; do
   echo "revision $r is " `svn diff -c $r | wc -c` " bytes";
done

Vous pouvez également essayer quelque chose comme ceci pour trouver des révisions qui ont ajouté des fichiers avec une extension particulière (ici, .jpg):

svn log -vq | egrep "^r|\.jpg$" | grep -B 1 "\.jpg$"

Si vous avez supprimé des fichiers à partir du référentiel en utilisant « SVN Supprimer », vous ne l'avez pas fait supprimé les fichiers. Ce serait la beauté du SVN. Une fois qu'un fichier est ajouté au référentiel, il est là pour toujours (à moins d'utiliser décharge et charge). Lors de « suppression » les fichiers, vous créez en fait une nouvelle révision qui marque la suppression, mais les fichiers continuent d'exister dans les révisions précédentes.

Je l'ai fait une décharge et charge, mais beaucoup beaucoup plus grand dépôt. Environ 60 000 révisions (!!!). Il a fallu du temps, mais à la fin, après le chargement attention, le dépôt est construit à nouveau.

Votre seule façon est de lister les modifications que les fichiers ont été ajoutés, modifiés et supprimés. Puis vider les révisions entre les deux, et de les charger dans l'ordre. Rendez-vous compte, il n'y a pas de place pour les erreurs. Si vous faites une erreur, vous devrez recommencer. Dump et charger depuis le début.

Ma suggestion, si les gros fichiers sont un problème, envisagez de créer un nouveau référentiel frais sans histoire. Gardez l'ancien pour la comparaison de l'histoire, et commencer à travailler avec des produits frais.

Bonne chance.

Si vous avez juste besoin de trouver l'infraction engage et vous avez accès au serveur hébergeant le référentiel: rechercher des fichiers volumineux dans db / régime moteur sous-répertoire du référentiel (en supposant qu'il utilise le format fsfs).

est-ce pas juste un problème différent, avec une étape supplémentaire? C'est à dire. vous devez localiser les fichiers que vous considérez être grand et binaire, puis vérifier si elles sont bien gérées par SVN ou ont été construits localement (ou importées du système d'actif parallèle, si elle est déjà en place).

Alors, trouvez les fichiers, puis faire svn info sur eux pour savoir si elles font partie du dépôt.

Juste une petite pensée, vous dites que l'état actuel du référentiel (la tête en cours) est bonne, à savoir les gros fichiers binaires ont été svn delete'ed dans le passé. Par conséquent, votre question est purement la taille du dépôt?

Je sais que vous avez dit que vous voulez garder tout l'engagement historique, mais comme une option, vous pouvez faire deux décharges, l'un pour toute l'histoire de révision, et une pour la révision HEAD actuelle.

Si vous mettez la décharge complète sur un DVD par exemple, vous auriez les données disponibles si jamais vous aviez besoin, mais vous pouvez alors supprimer le référentiel entier et svn charger la décharge de révision, vous laissant avec un petit dépôt propre.

il est également possible de déverser à partir d'une révision spécifique en avant, plutôt que la tête, par exemple, vous pouvez garder les 3 derniers mois de révisions et vider tout plus sur un DVD ....

Élaborant sur la réponse de Otherside, voici ce qui a fonctionné spécialement pour moi:

svnadmin create new-repo
svnadmin dump old-repo | svndumpfilter exclude --pattern '*.exe' '*.jpg' '*.png' | svnadmin load new-repo

Vous pourriez être en mesure d'exclure vos répertoires de Obj et Bin en les ajoutant à la commande svndumpfilter -. Je n'y suis pas allé

En outre, le programme de fsfs-stats de Subversion (nouveau dans Subversion 1.8, remplacé par 1.9 par svnfsfs stats) pourrait être utile pour quantifier les types de fichiers et des fichiers spécifiques remplir votre dépôt.

Cela peut être utile pour comparer les dépôts après:

colordiff -u <(svn log -v file:///.../old-repo ) <(svn log -v file:///.../new-repo)
Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top