2010-11-15 26 views
1

Dans le passé, j'ai utilisé la fonctionnalité d'importation de GitHub pour importer un référentiel SVN. Le référentiel est maintenant le même qu'un git nu sans aucune connexion à l'historique SVN. Les validations n'incluent pas les informations svn-id.Comment fusionner un référentiel svn avec un dépôt git cloned (importé de SVN via github)

Un certain temps s'est écoulé et des validations ont été ajoutées au référentiel SVN mais, comme prévu, le dépôt git est resté le même. Maintenant, je voudrais mettre à jour le dépôt git avec les validations qui ont été ajoutées au SVN d'origine. J'ai essayé git-svn mais je ne pouvais pas faire git reconnaître l'histoire commune entre le svn cloné et le git cloné.

J'ai considéré l'utilisation de format-patch et je crois que cette action devrait résoudre le problème mais je cherchais une manière plus automatisée de le faire.

La seule restriction est que l'historique git doit être maintenu (pas rebase 'ing) et que les commits sont aussi fidèles que possible au dépôt SVN (pas de svn-id ajouté au message de validation).

Répondre

1

Comme vous l'avez deviné, obtenir les commits pour "fusionner" correctement ne va pas vraiment fonctionner ici. Vous devrez utiliser format-patch. Voici comment je le ferais:

$ git svn clone --no-metadata svn://.../ new-svn-repo 
$ cd new-svn-repo 
$ git log 

(Vous voudrez peut-être ajouter l'option -A-git svn clone de réécrire les informations d'auteur SVN d'un format [email protected] en bonne information de l'auteur Joe User <[email protected]> Voir man git-svn pour plus d'informations.).

Parcourez le journal et recherchez la validation correspondant à la dernière validation dans le référentiel github. Si tel est engage abcdef alors:

$ git format-patch -k abcdef 

Vous avez maintenant un tas de fichiers *.patch qui correspondent aux nouveaux commits que vous voulez au port sur. Donc ...

$ cp *.patch /github/repository/location 
$ cd /github/repository/location 
$ git am -k --keep-cr *.patch 

Tada! Maintenant, il suffit de pousser maître à Github.

(Si votre Git n'est pas assez nouveau, il peut se plaindre de l'argument --keep-cr-git am. Si vos fichiers source ne contiennent pas CRs puis retirez simplement --keep-cr. Mais si elles le font, vous devrez peut-être mettre à jour votre Git depuis git mailsplit, appelé par git am, dépouillera tous les CR dans les fichiers de correctif lors du traitement.Cela peut causer l'application de correctifs.)

+0

Le seul problème que j'ai trouvé avec ceci est que git-am ajoute mon utilisateur en tant que "committe". ". Avez-vous une idée de comment éviter cela? J'ai vérifié la documentation de git-am mais je n'ai rien trouvé d'explicite. – Unode

+0

Eh bien, il devrait, ne devrait-il pas? Vous étiez celui à engager dans le dépôt Git. Si vous n'aimez pas cela, vous pouvez utiliser 'git-filter-branch' pour réécrire l'historique que vous avez importé. – cdhowie