2010-07-21 7 views
1

Je ne fais que commencer par git et l'utiliser pour interagir avec un dépôt SVN. Le repo svn est dans un format standard, donc je configuré mon bac à sable commegit-svn-rebase valide une balise SVN

git svn clone <repo> -s 

Tout semblait bien au départ, mais après plusieurs rebasage, dcommits et balises je semble être toujours commiting une balise SVN. Faire un rendement d'exécution dcommit sec:

$ git svn dcommit --dry-run 
Committing to http://proj.badc.rl.ac.uk/svn/badc/users/spascoe/metaconfig/tags/0.1.1 ... 
diff-tree a1265119164b79cfb12d28a7059d453fb4eb13f7~1 a1265119164b79cfb12d28a7059d453fb4eb13f7 

Mon .git/config est:

[core] 
    repositoryformatversion = 0 
    filemode = true 
    bare = false 
    logallrefupdates = true 
    autocrlf = false 
[svn-remote "svn"] 
    url = http://proj.badc.rl.ac.uk/svn/badc 
    fetch = users/spascoe/metaconfig/trunk:refs/remotes/trunk 
    branches = users/spascoe/metaconfig/branches/*:refs/remotes/* 
    tags = users/spascoe/metaconfig/tags/*:refs/remotes/tags/* 

farfouillé dans .git n'aide pas. Une idée de ce qui ne va pas?

+0

Que voulez-vous dire par "après plusieurs [...] étiquettes?" – lindelof

+0

Même lorsque je re-clone le dépôt SVN je finis par commettre des tags/0.1.1. En fin de compte, j'ai résolu ce problème en effectuant un commit fictif dans SVN, en reclonant avec git puis en fusionnant mes changements en attente d'un repo git à un autre. Je ne suis pas en train de commettre à svn trunk. J'aimerais toujours savoir comment ce gâchis pourrait avoir eu lieu :-) – spascoe

+0

@lindelof. Pour être honnête, je ne m'en souviens pas. Je pense que j'ai essayé "git tag" et j'ai trouvé que ça n'avait rien à voir avec svn. Puis j'ai fait "svn tag" avant de trouver que je pouvais utiliser "git svn tag". – spascoe

Répondre

2

La commande git svn comportait un bogue dans lequel la branche principale pouvait être orientée vers autre chose que svn trunk lors de l'importation initiale d'un référentiel svn. Il a été corrigé dans git v1.6.5 et plus tard (dans v1.6.5-rc0~75 si vous avez vérifié git).

Si vous avez déjà terminé d'extraire le référentiel svn et que vous voulez vous assurer que la branche principale pointe vers svn trunk, procédez comme suit.

REMARQUE: Ces instructions supposent que vous avez validé ou planqué les modifications locales que vous avez apportées. Utilisez git stash save pour enregistrer les travaux non validés et git branch newbranchname pour créer une branche à votre dernière validation.

  1. Passer à la branche maître à l'aide git checkout master si vous n'êtes pas déjà là. Utilisez git branch pour voir votre branche actuelle, qui est celle avec un astérisque ('*') à côté de lui.

  2. Exécutez git svn info et vérifiez le champ "URL:". Si l'URL pointe sur le tronc, alors vous avez terminé. Le prochain git svn dcommit s'engagera à la ligne de réseau à partir de la branche principale.

  3. Si git svn info des points à une étiquette ou une URL de branche, exécutez git log et trouver le premier commit qui a une URL "git-svn-id:" qui pointe vers l'URL de votre tronc svn. Copiez le hash de validation de 40 caractères (sur la ligne commençant par "commit") qui représente cette validation.

  4. Réinitialiser la branche master à la validation de hachage en utilisant git reset --hard commit-hash remplacer « commit-hash » avec le hachage engagement à l'étape 3.

    REMARQUE: Cette étape est la plus dangereuse! Assurez-vous d'avoir sauvegardé tout votre travail! Faites une archive tar de votre répertoire de travail si nécessaire.

  5. Exécutez à nouveau git svn info pour vous assurer que le champ "URL:" indique que vous êtes sur le tronc. Si ce n'est pas le cas, vous avez copié le mauvais hachage de validation à l'étape 3. Passez à l'étape 3 et réessayez.

  6. Exécutez git svn rebase pour mettre à jour votre branche principale vers la dernière révision sur le tronc dans votre référentiel svn.

Pro Tip: experts remarqueront que vous pouvez analyser la ligne « git-svn-id: » en bas de chaque journal de livraison pour déterminer si un particulier est commettras sur le tronc, sur une étiquette ou sur une branche. Il suffit donc d'utiliser git log master pour vérifier si la première validation de la branche principale pointe vers l'URL de jonction de votre référentiel svn.

Questions connexes