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
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.
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 @revisionnumber
ne 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.