clone git-svn / branches parasites

J'ai utilisé la commande suivante pour cloner svn repo dans git et après l'avoir exécuté, je vois quelques branches fausses.

git svn clone [SVN repo URL] --no-metadata -A authors-transform.txt --stdlayout ~/temp

git branch -a

*(no branch)
  master
  remotes/abc-1.3.x
  remotes/abc-1.3.x@113346
  remotes/abc-1.3.x@541512
  remotes/branch_test_script
  remotes/tags/modules-1.2
  remotes/tags/modules-1.2@113346
  remotes/tags/modules-1.2@516265
  remotes/tags/release-1.1
  remotes/tags/release-1.1@113346
  remotes/tags/release-1.1@468862
  remotes/trunk

Les branches créées dans svn étaient abc, branch_test_script, modules et release. Quelqu'un peut-il aider à comprendre ce que 'abc-1.3.x @ 113346', ' abc-1.3.x @ 541512' ... 'release-1.1@468862" etc sont ?

Comment Pouvons-nous nous débarrasser de ces branches fausses / que signifient-elles ?

Merci,
Gayathri

22
demandé sur crankparty 2012-07-06 10:24:01

2 réponses

Tl; dr:

git svn crée ces " @ " - branches si une branche (ou une balise) a été créée pour un sous-répertoire (ou pour un autre répertoire qui n'est pas suivi par git-svn). Il y aura toujours aussi une branche "régulière" avec le même nom, mais sans le suffixe"@". La branche "@ " n'existe que comme point de branchement pour la branche régulière.


Remarque: j'ai soumis un patch pour cela; une version modifiée de cette explication fait maintenant partie de la page de manuel officielle git svn, en tant que nouvelle section "Gestion des BRANCHES SVN" (depuis git 1.8.1).


Dans Subversion, les branches et les balises ne sont que des copies d'une arborescence de répertoires, il est donc possible (bien que généralement déconseillé) de créer une branche à partir d'un répertoire qui n'est pas lui-même une branche (ou un tronc). Par exemple, en copiant /trunk / foo dans / branches / bar, au lieu de copier /trunk (une "branche de sous-répertoire", pour ainsi dire), ou en copiant un répertoire qui se trouve en dehors de la structure trunk / tags / branches (ce qui est possible dans SVN).

Dans git, cependant, une branche est toujours pour l'ensemble du repo, les branches de sous-répertoire n'existent pas. git svn utilise donc une solution de contournement. S'il détecte une branche qui a été copiée à partir d'un répertoire qui n'est pas lui-même suivi en tant que branche par git-svn, il créera un nouvel historique. Par exemple, pour une branche de sous-répertoire où /trunk / foo est copié dans / branches / bar dans r1234, il va créer:

  • un nouveau commit git pour chaque révision SVN de r1233 en arrière (notez que le nombre est le dernière révision avant la création de la branche). Les arbres de ces commits ne contiendront que le sous-répertoire qui a été ramifié. Donc, pour chaque révision de r1233 en arrière, il y aura généralement deux commits git, un avec l'arbre entier (créé lorsque git-svn a traité l'historique de trunk), et les nouveaux.
  • une branche factice appelée "bar@1233" (branch name@revision), qui pointe vers le commit créé à partir de r1233 ci-dessus.
  • un commit de r1234, le commit qui a créé la branche. Ce commit aura la branche ci-dessus comme ancêtre (seulement).
  • une branche appelée "bar", qui pointe vers le deuxième commit.

De cette façon, pour la barre de branche du sous-répertoire, vous obtenez deux branches dans git

  • bar@1233, qui représente l'état du référentiel à partir duquel la branche a été créée
  • bar, qui représente la branche

Je ne suis pas tout à fait sûr pourquoi cette branche factice est créée. Je pense que c'est fait pour représenter l'information A propos de quelle révision la branche a été ramifiée, et d'avoir un historique complet pour la branche.


Notez que tout ce mécanisme peut être désactivé en utilisant le drapeau --no-follow-parent. Dans ce cas, chaque branche SVN aboutira à une branche git avec seulement les commits du répertoire SVN branch. Chaque branche ne sera pas connectée au reste de l'historique et aura son propre commit racine, correspondant au premier commit de la branche.

16
répondu sleske 2013-01-03 02:15:47

J'avais aussi des branches si étrangement appelées quand j'ai cloné mon dépôt SVN dans un dépôt Git.

Après avoir examiné les branches attendues (dans votre cas modules-1.2, abc-1.3.x, branch_test_script et release-1.1) j'ai remarqué que les branches @revisionnumberne sont rien d'autre que des commits dans leurs branches préfixées.

Si vous voulez le faire manuellement, ouvrez gitk sur la branche abc-1.3.x et vérifier que abc-1.3.x@113346 et abc-1.3.x@541512 afficher dans l'histoire de cette branche. Si oui, vous pouvez supprimer la succursale.

Cela pourrait être un peu encombrant si vous avez beaucoup de branches ou de nombreux engage à parcourir.

Manière automatique: demandez à git de le faire pour vous:

git branch -r --contains abc-1.3.x@113346

Fera écho (ou au moins devrait )

abc-1.3.x
abc-1.3.x@113346
abc-1.3.x@541512

Cela signifie que vous pouvez supprimer en toute sécurité abc-1.3.x@113346, car il est contenu dans abc-1.3.x:

git branch -r -d abc-1.3.x@113346

En raison de L'histoire linéaire de SVN, il est bien sûr également contenu le commit (plus récent) 541512.


Note de Côté:
Vous avez peut-être remarqué que votre SVN les balises ne sont pas réellement converties en balises Git et en branches git natives. Cela pourrait être réalisé en utilisant svn2git pour cloner le dépôt SVN dans un dépôt Git.

4
répondu eckes 2012-07-06 10:08:44