2010-09-20 5 views
2

Je viens converti un repo 10G CVS (environ 120 modules) dans un git unique à l'aide cvs2git sans aucune erreur sur une machine RHEL5. J'aimerais diviser un sous-répertoire + historique du référentiel et en créer un nouveau. (comme: How can I move a single directory from a git repository to a new repository whilst maintaining the history?)git filtre branches - aucun progrès à la fin

J'ai essayé:

git filter-branch --subdirectory-filter xxx.model -- --all 

qui fonctionne très bien, jusqu'à ce que le dernier élément est traité - il se bloque à l'aide CPU sans aucun progrès. En utilisant strace, il ressemble à ceci: [lien brisé]. strace -si toutes les fourches se retrouvent dans une sortie> 2.5G - je ne sais pas si elle grossit; Je l'ai arrêté.

Qu'est-ce qui cause ce comportement étrange? Existe-t-il une autre méthode de création d'un nouveau référentiel avec un sous-répertoire + historique d'un référentiel existant?

+0

Après avoir fait ce genre de conversion moi-même, je suis d'accord avec le commentaire de @ mhagger à faire la conversion par morceaux. Ce que vous vivez ressemble cependant à un bogue dans une branche de filtre git. Vous devriez probablement poster un écrit avec autant d'informations que vous pouvez à la liste de diffusion Git, et demander là. – Novelocrat

Répondre

2

L'opération s'est terminée avec succès après plusieurs heures de fonctionnement. Le seul problème était, qu'il nous semblait qu'il n'y avait pas de progrès, mais ce n'est pas vrai. Il n'y a juste pas de sortie.

Set GIT_TRACE = 1 et refaire la commande et il y a la production et des progrès visibles.

Il est possible que la grande quantité d'étiquettes a causé l'opération à ralentir.

+0

En effet, j'ai découvert depuis que "git filter-branch" est atrocement lent s'il doit réécrire beaucoup de branches/tags. Je viens de soumettre des correctifs à git pour résoudre ce problème. – mhagger

+0

Notre projet a une tonne de tags. La trace montre ceux qui coulent. –

0

Quoi que vous fassiez, il faudra le dépôt git existant à être réécrite. Donc, vous pourriez tout aussi bien lancer la conversion, en divisant les projets en premier puis en convertissant les projets séparément.

Si les deux projets se trouvent déjà dans des sous-répertoires distincts du référentiel CVS, vous pouvez simplement pointer cvs2git dans un sous-répertoire, puis à l'autre. Si les projets sont plus entremêlés les uns avec les autres, faites une copie du référentiel CVS, utilisez les commandes du système de fichiers pour séparer les projets dans des sous-répertoires séparés, et convertissez-les à nouveau séparément.

+0

Merci - ce serait une solution possible pour la situation actuelle (repository frais converti/créé). Mais le problème est plus général si l'on veut restructurer le dépôt un jour. – usr200910

0

Parlée aux personnes freenode/# git J'ai trouvé une autre façon de faire la même chose en supprimant tout (rm git) sauf le répertoire que je veux garder.

git filter-branch --prune-empty --index-filter "git ls-files --exclude-standard |grep -v '^foobar'|xargs git rm -r -f --cached --ignore-unmatch" HEAD 

Cette opération est lente, mais fonctionne (pense que oui). Je n'ai pas regardé le résultat à cause d'un avortement.

BTW: Quelqu'un dans #git m'a dit que ces opérations pouvaient souvent durer plusieurs jours, donc il est probable que si j'avais attendu (bien qu'il semble qu'il n'y ait pas de progrès/"ça se bloque") il était fini.

Questions connexes