2016-01-26 3 views
1

J'ai travaillé sur du code local sur mon ordinateur, en suivant les modifications en utilisant git (pas de remote). Ce code doit maintenant devenir un module dans un projet plus grand, dont le code est stocké dans Subversion (donc quelque chose comme https://svnserver/svnroot/project/trunk/module_x), alors j'ai pensé que je pouvais utiliser git-svn pour gérer le dépôt Subversion comme distant. Je me souviens de l'avoir fait avant pour un autre projet mais je n'ai pas trouvé le modus operandi (ordinateurs changés entre les deux).git-svn: committe l'historique entier d'un dépôt git existant dans un sous-répertoire vide de Subversion

Voici ce que j'ai essayé:

cd ~/mygitrepo/ 
git svn init https://svnserver/svnroot/project/trunk/module_x 
git svn fetch 
git svn rebase 

La dernière commande donne le message d'erreur suivant:

Unable to determine upstream SVN information from working tree history 

je l'ai lu quelque part que ce pourrait être parce que le répertoire était vide Subersion alors j'ai essayé commettre un fichier fictif à SVN séparément, puis couru:

git svn fetch 
    A dummy.txt 
r10744 = 89294ba713c6fed368f3b879c8dc7744b1015308 (refs/remotes/git-svn) 

Cependant, je ne peux pas t trouver le fichier dummy.txt dans mon repo git et à la fois rebase et dcommit continueront à afficher le même message d'erreur. Qu'est-ce que j'ai fait de mal?

Répondre

2

La réponse fournie par Jan donne la justification de l'erreur que j'ai rencontrée et indique git rebase --onto comme étant la bonne solution, mais il manque les commandes réelles.

J'ai d'abord proposé ces commandes comme modifier sa réponse, mais il a été rejeté, donc voilà:

git checkout -b svnrebase git-svn   # create a temporary branch 
git cherry-pick master~1      # cherry pick the first commit 
git rebase --onto svnrebase master~1 master # rebase the 2nd through current commit 
git svn dcommit        # finally commit the results to svn 

NOTE que master~1 doit être modifié pour faire référence à votre premier commettras au maître git. Ici, nous supposons que nous avons un repo git avec seulement deux commits.

Il est nécessaire de créer une branche temporaire et écrémer le premier commettras à maîtriser parce que rebase --onto rebasage la gamme des modifications apportées aprèsmaster~1 (et la référence master~2 n'existerait avec seulement deux commits).

2

Votre branche empruntée ne provient pas de subversion, donc git svn ne sait pas comment l'utiliser.

Git fait, cependant, ce que vous devez faire est d'utiliser plaine git rebase pour rebaser sur git-svn (refs/remotes/git-svn). Alors l'histoire contiendra des commits venant de subversion et git svn dcommit saura où l'engager.

Une autre chose est que vos modifications doivent être placés dans le sous-répertoire avant vous essayez de les rebaser, car git rebase ne prend pas en charge le déplacement dans le sous-répertoire. git merge, via la stratégie subdirectory, mais l'utilisation de la fusion sera exportée vers Subversion en tant que validation unique. Si vous voulez exporter l'histoire complète, et vous ne l'avez pas dans le bon répertoire dans tous les commits, vous devrez utiliser git filter-branch pour le réparer.

+0

Merci d'avoir fourni la justification et de m'indiquer la bonne direction, par ex. 'git rebase --onto'.J'ai édité votre réponse pour ajouter la séquence de commandes, car rebaser le commit initial sur git-svn n'est pas trop trivial et cela pourrait aider quelqu'un d'autre. – Shadocko

+0

Modifier a été rejeté, donc je vais répondre à ma propre question à la place. – Shadocko