2011-08-19 2 views
2

Dans ma société, nous utilisons SVN, mais voulons passer sans problème à GIT à l'avenir. C'est pourquoi j'ai commencé à apprendre git-svn, qui promet de servir d'interface pour svn repository.Comment utiliser git-svn correctement, svn-ers checkout svnrepo et git-ers clone gitrepo, en commettant négligemment

J'ai essayé de l'utiliser avec la configuration suivante:

  • SVNREPO - le dépôt svn maître
  • GITREPO - clone git-svn de SVNREPO
  • REPO1, REPO2, ... - clones git de GITREPO représentant git-ers

Les exigences sont les suivantes:

  • [ManyGitUsers] beaucoup giters peuvent cloner/pousser à GITREPO
  • [ManySvnUsers] beaucoup svners engagent à SVNREPO
  • [SyncHook] synchronisation entre GITREPO et SVNREPO peut être fait en crochet, ou manuellement par admin avant que le crochet est développé
  • [NoInteraction] giters ne veulent pas savoir quelque chose sur SVNREPO et vice versa
  • [NoProactivity] les utilisateurs résolvent tous les problèmes (conflits) quand ils se produisent; ils ne sont pas synchronisés avec les autres pour les éviter

Questions:

  1. Est-ce possible avec la configuration git-svn? Suggérer d'autres s'il y en a un meilleur
  2. Comment dois-je configurer le GITREPO?
  3. Les utilisateurs doivent-ils connaître le backend spécial ou tout est-il transparent?

Jusqu'à présent, mes expériences ont montré qu'il plusmoins œuvres, mais engagent dans SVNREPO transgresse la possibilité de synchroniser avec git. Je crois juste que la raison est que je suis en train d'émettre de mauvaises commandes ...

Répondre

1

Je ne pense pas que cela puisse durer longtemps et causer des problèmes.

Tout d'abord permettez-moi de parler de la façon dont la mise en miroir svn est fait:

Habituellement, il y a une prise en pension de maître et un esclave repo (à différents endroits en général, d'où la nécessité). Les svners, à la caisse d'emplacement de maître et commettent du maître. Ceux à l'endroit de l'esclave checkout et commettent à l'esclave. Mais la configuration actuelle est que chaque fois que quelqu'un commet dans le miroir, la validation de l'esclave est d'abord validée par le maître, puis mise en miroir avec l'esclave (svnsync).L'utilisateur final n'est pas conscient de cela. Cela s'assure que les repos sont synchronisés. Plus d'explications sur cette configuration: http://www.tty1.net/blog/2007-08-26-subversion-proxy_en.html

Maintenant, apportez Git, il devient difficile. La chose est, il peut y avoir presque simultanés commits dans le bot le repo Git et le repo SVN. Si le commit dans SVN est appliqué et que le nouveau commit vient de Git (qui n'avait pas vu le nouveau commit dans SVN), vous aurez beaucoup de problèmes.

La configuration que vous pouvez avoir est que tous les utilisateurs utilisent git-svn pour "cloner" le svn repo directement. Ils peuvent ensuite utiliser le repo git comme n'importe quel autre client svn.

Ou il y a un repo git central comme vous l'avez mentionné (clone avec git-svn) et tous les giters en sont clones et poussent dessus. Il y a un crochet à git svn rebase et git svn dcommit du dépôt central, mais quand les choses se cassent, quelqu'un corrige manuellement le repo.

+0

vous dites que tous les utilisateurs doivent git-svn clone directement ... mais, est-ce que ça marche vraiment? Je crois comprendre que "git svn rebase" réappliquera tous les commit git locaux en plus de svn commit - avec l'effet de changer les numéros de révision de tous les commits locaux - ce qui casse toujours le dépôt et m'empêche d'effectuer d'autres commit ou push . Est-ce correct ? –

+0

Je viens de trouver cette question: http://stackoverflow.com/questions/570945/git-clone-of-git-svn-tree (merci à la colonne correspondante!) Fournissant une explication qui confirme les mauvaises nouvelles: git-svn est bon pour la migration ponctuelle, pas pour une utilisation continue pendant une période de transition plus longue :( –

0

Cela fonctionne. Rechercher/Lire la documentation. Il y a aussi des tonnes de livres qui couvrent cela.

Fondamentalement, les utilisateurs de GIT ont toutes les responsabilités et tout sur le côté SVN reste le même.

Sur chaque commit SVN, les utilisateurs GIT doivent faire git svn rebase. Sur chaque commit GIT, les utilisateurs GIT doivent faire git svn dcommit.

+0

Bien que cela signifie que l'utilisateur git doit vérifier de manière proactive et proactive les engagements svn, alors ce système est inutilisable. Ce que je veux, c'est un flux de travail normal - je commets, je commets, je committe, parfois je pousse/tire, sans avoir à m'en soucier. Un peu plus de travail pour la résolution des conflits est acceptable, mais pas de proactivité. Je crois toujours que c'est possible, mais mes tests montrent que non seulement la façon dont je l'ai décrit –

+0

Alors peut-être que vous ne pouvez pas utiliser GIT comme vous le souhaitez. Généralement SVN est le repos "principal" et les utilisateurs du GIT tirent la validation d'édition depuis et vers les repos SVN. Vous ne pouvez pas utiliser GIT comme un autre SVN, il y a une raison pour laquelle les deux outils existent. – ayckoster

+0

sûr mais je veux utiliser GIT comme normalement - c'est-à-dire, sans avoir à vérifier proactivement les validations à distance. Pour moi, VCS distribué signifie que je n'ai pas de connexion la plupart du temps - et donc je ne peux pas vérifier de toute façon –

4

Il existe une alternative à git-svn qui répond à vos besoins: SubGit. Je travaille sur le projet SubGit, mais j'espère que cette réponse est pertinente et ne serait pas considérée comme un spam. SubGit est un outil que vous installez dans votre référentiel une fois sur le serveur. Ensuite, vous serez en mesure de cloner ce dépôt en utilisant 'git clone' ou checkout en tant que copie de travail Subversion. Les utilisateurs Git fonctionneront comme ils le feraient avec le dépôt Git ordinaire, aucune commande spéciale n'est nécessaire. La même chose est correcte pour les utilisateurs de Subversion. Les côtés Git et Subversion sont automatiquement synchronisés avec SubGit.

Questions connexes