2010-12-12 74 views
1

Au cours d'avoir ce repo (à l'origine SVN) je n'ai pas été bon à garder les liens de fichiers ensemble. J'ai changé les IDE deux fois, divisé le projet en modules Netbeans et mavisé le projet au fil du temps. La plus grande partie de l'historique des fichiers est perdue, principalement parce que lors de la mavenizing, j'ai effacé la totalité du tronc, commis, copié sur le projet maven, et commis. Pas exactement la meilleure idée, car j'ai découvert plus tard toute l'histoire réinitialisée à ce point. Il est devenu tellement mauvais qu'un programme de statistiques de dépôt est inutile, car il dit que j'ai 50 000 lignes de code investi au lieu de ~ 8 000.Réparer les liens entre les fichiers déplacés dans Mercurial

Est-il possible de corriger tous les historiques de fichiers endommagés? J'ai accès à SVN et Git si Mercurial ne peut pas le faire

Répondre

3

Hrm, et le temps que vous avez fait votre suppression et copie que vous auriez été bien vous aviez juste fait hg addremove --similarity 90 qui dit "enlever tout ce qui est parti, ajouter tout ce qui est nouveau, et s'ils sont à 90% semblables les uns aux autres, le compte est comme un changement de nom ".

Maintenant que cette opportunité est passée, il n'y a aucun moyen de déplacer un sans réécrire votre référentiel, ce qui invalide tous les clones dans la nature alors que tous les identifiants de nœuds (hachages) changent. Si c'est correct et vous avez une histoire en grande partie linéaire, vous pouvez probablement vous en tirer quelque chose comme ceci:

hg export --output "../patch-%n.patch" 0:tip # exports every changeset to a patch file 
cd .. 
hg init newrepo 
cd newrepo 
hg import --similarity 90 ../patch* 

qui prend une histoire linéaire de votre première commettras à vos dernières (à l'exclusion des branches et d'autres têtes, etc.) exportations les patches, crée un nouveau repo vide et importe les changesets à l'aide de la fonction de détection de renommer.

Ceci est un acte assez drastique alors assurez-vous que ça vaut vraiment le coup pour vous et gardez votre vieux repo pour faire bonne mesure.

+0

Comme je suis la seule personne sur ce repo et que personne ne l'a cloné, je devrais bien me débrouiller avec ça. Cependant, existe-t-il un moyen de fusionner les commits de suppression et de copie que j'ai fait pendant que SVN? Parce que vous avez toujours le problème de l'histoire brisée avant le mavenizing. La seule façon dont je peux penser à revenir à cette révision spécifique, faire le travail, puis appliquer tous les changements sur le dessus. Mais c'est quelque chose que je ne connais pas très bien sur Mercurial et je pense que ça ferait perdre tous les timestamps, quelque chose que je veux préserver. – TheLQ

+0

Si vous allez sur la route export-everything import-everything, vous pouvez fusionner deux changesets en utilisant 'hg import --no-commit' et en faisant les deux imports avant de faire' hg commit'. Les horodatages peuvent être réglés sur tout ce que vous voulez sur un changeset (voir 'commit --date') et les fichiers d'amorçage ne sont pas suivis du tout. –

+0

Pour en revenir à cette question, j'essayais de le faire, mais je rencontre des problèmes pour recréer le repo. J'exporte avec 'hg export --git -a -o" ../patch-%r.patch "-vv 0: tip' et importe avec (grandement simplifié)' for i in \ 'ls .. | grep patch \ '; do hg import --similarity 90 --user "..." --force --date "..." ../$i; fait. Cependant, j'ai beaucoup d'erreurs d'importation: Les fichiers n'existent pas, ils existent déjà, ou sont rejetés. Aucune suggestion? – TheLQ