J'ai fait tout mon travail dans Git et j'ai poussé vers GitHub. Je suis très satisfait du logiciel et du site, et je ne souhaite pas changer mes pratiques de travail à ce stade.
Mon conseiller de doctorat demande à tous les étudiants de conserver leur travail dans un référentiel SVN hébergé à l'université. J'ai trouvé des tonnes de documentation et de tutoriels sur le point de dérouler un référentiel SVN existant dans Git, mais rien sur le fait de pousser un référentiel Git vers un nouveau référentiel SVN. Je m'attends à ce qu'il y ait un moyen de le faire avec une combinaison de git-svn et une nouvelle branche et rebasage et tous ces termes merveilleux, mais je suis un débutant Git et je ne me sens en confiance avec aucun d'entre eux.
Je veux ensuite simplement exécuter quelques commandes pour pousser les validations vers ce référentiel SVN lorsque je le souhaite. Je souhaite continuer à utiliser Git et avoir juste le miroir de dépôt SVN ce qui est dans Git.
Je serai la seule personne à s'engager sur SVN, si cela fait une différence.
Réponses:
J'en avais également besoin, et avec l'aide de la réponse de Bombe + quelques bidouilles, je l'ai fait fonctionner. Voici la recette:
Importer Git -> Subversion
Après # 3, vous obtiendrez un message cryptique comme celui-ci:
Ignorez cela.
Lorsque vous exécutez # 5, vous pouvez rencontrer des conflits. Résolvez ces problèmes en ajoutant des fichiers avec l'état "non fusionné" et en reprenant le rebase. Finalement, vous aurez terminé; puis synchronisez à nouveau vers le référentiel SVN, en utilisant
dcommit
. C'est tout.Garder les référentiels synchronisés
Vous pouvez maintenant synchroniser de SVN vers Git, en utilisant les commandes suivantes:
Et pour synchroniser de Git vers SVN, utilisez:
Note finale
Vous voudrez peut-être essayer cela sur une copie locale, avant de postuler à un référentiel actif. Vous pouvez faire une copie de votre référentiel Git dans un emplacement temporaire; utilisez simplement
cp -r
, car toutes les données sont dans le référentiel lui-même. Vous pouvez ensuite configurer un référentiel de test basé sur des fichiers, en utilisant:Et vérifiez une copie de travail en utilisant:
Cela vous permettra de jouer avec les choses avant d'apporter des changements durables.
Addendum: si vous vous trompez
git svn init
Si vous exécutez accidentellement
git svn init
avec la mauvaise URL et que vous n'êtes pas assez intelligent pour effectuer une sauvegarde de votre travail (ne demandez pas ...), vous ne pouvez pas simplement exécuter à nouveau la même commande. Vous pouvez cependant annuler les modifications en émettant:Et supprimez la section
[svn-remote "svn"]
section.Vous pouvez ensuite
git svn init
recommencer.la source
Voici comment nous l'avons fait fonctionner:
Clonez votre référentiel Git quelque part sur votre machine.
Ouvrez .git / config et ajoutez ce qui suit (dans Maintenance d'un miroir SVN en lecture seule d'un référentiel Git ):
Maintenant, à partir d'une fenêtre de console, saisissez-les:
Maintenant, s'il se casse ici pour une raison quelconque, tapez ces trois lignes:
Et enfin, vous pouvez vous engager sur SVN:
Remarque: je supprime toujours ce dossier par la suite.
la source
Unable to determine upstream SVN information from HEAD history.
git merge -s recursive -Xtheirs --allow-unrelated-histories master
.En utilisant
git rebase
directe perdra le premier commit. Git le traite différemment et ne peut pas le rebaser.Il existe une procédure qui conservera l'historique complet: http://kerneltrap.org/mailarchive/git/2008/10/26/3815034
Je vais transcrire la solution ici, mais les crédits sont pour Björn.
Initialisez git-svn:
Le --prefix vous donne des branches de suivi à distance comme "svn / trunk" ce qui est bien parce que vous n'obtenez pas de noms ambigus si vous appelez votre branche locale juste "trunk". Et
-s
est un raccourci pour la disposition standard de tronc / tags / branches.Récupérez le contenu initial de SVN:
Recherchez maintenant le hachage de votre commit racine (devrait montrer un seul commit):
Ensuite, récupérez le hachage de la validation du tronc vide:
Créez le greffon:
Maintenant, "gitk" devrait apparaître
svn/trunk
comme le premier commit sur lequel votre branche principale est basée.Rendre la greffe permanente:
Laissez tomber la greffe:
gitk devrait toujours apparaître
svn/trunk
dans l'ascendance du maître.Linéarisez votre histoire au sommet du coffre:
Et maintenant, "git svn dcommit -n" devrait vous dire qu'il va s'engager dans le tronc.
la source
Créez un nouveau répertoire dans le référentiel Subversion pour votre projet.
Passez à votre projet géré par Git et initialisez git-svn.
Cela créera un seul commit car votre répertoire de projet SVN est toujours vide. Maintenant, rebasez tout sur ce commit,
git svn dcommit
et vous devriez avoir terminé. Cependant, cela gâchera sérieusement vos dates de validation.la source
Git -> SVN avec l'historique complet des validations
J'avais un projet Git et je devais le déplacer vers SVN. C'est comme ça que je l'ai fait, en gardant tout l'historique des commit. La seule chose qui est perdue est l'heure de validation d'origine puisque libSVN définira l'heure locale lorsque nous le ferons
git svn dcommit
.Comment:
Avoir un dépôt SVN où nous voulons importer nos trucs et les cloner avec git-svn:
Va là-bas:
Ajoutez la télécommande du référentiel Git (dans cet exemple, j'utilise C: /Projects/repo.git ). Vous voulez pousser vers SVN et lui donner le nom old-git:
Récupérez les informations de la branche principale du référentiel old-git vers le référentiel actuel:
Récupérez la branche principale de la télécommande old-git dans une nouvelle branche appelée old dans le référentiel actuel:
Rebase pour mettre le HEAD au-dessus de old-git / master. Cela maintiendra tous vos engagements. Ce que cela signifie, c'est de prendre tout votre travail effectué dans Git et de le mettre au-dessus du travail auquel vous accédez à partir de SVN.
Revenez maintenant à votre branche principale:
Et vous pouvez voir que vous avez un historique de validation propre. C'est ce que vous voulez pousser vers SVN.
Poussez votre travail vers SVN:
C'est tout. Il est très propre, pas de piratage, et tout fonctionne parfaitement hors de la boîte. Prendre plaisir.
la source
git svn
préparations sont nécessaires.Je proposerais une instruction très courte en 4 commandes utilisant SubGit . Voir cet article pour plus de détails.
la source
J'avais besoin de valider mon référentiel Git existant dans un référentiel SVN vide.
Voici comment j'ai réussi à faire ceci:
Cela a fonctionné sans problème. J'espère que ça aidera quelqu'un.
Comme je devais m'autoriser avec un nom d'utilisateur différent du référentiel SVN (mon
origin
utilise l'authentification par clé privée / publique), j'ai dû utiliser la--username
propriété.la source
git-svn
avant que cela ne soit possible, voir stackoverflow.com/questions/527037/git-svn-not-a-git-commandSi vous souhaitez continuer à travailler avec Git en tant que référentiel principal et que vous avez juste besoin d'exporter les révisions vers SVN de temps en temps, vous pouvez utiliser Tailor pour garder le référentiel SVN synchronisé. Il peut copier des révisions entre différents systèmes de contrôle de source et mettrait à jour le SVN avec les modifications que vous apportez dans Git.
Je n'ai pas essayé de conversion de Git en SVN, mais pour un exemple SVN -> SVN, voyez cette réponse .
la source
Encore une autre séquence qui a fonctionné (avec quelques commentaires sur chaque étape):
Installation
git-svn
etsubversion
kits d'outils:Basculez à l'intérieur du
PROJECT_FOLDER
Créez le chemin du projet sur le serveur Subversion (malheureusement le
git-svn
plugin actuel a un défaut par rapport à TortoiseSVN). Il ne peut pas stocker le code source directement dans lePROJECT_FOLDER
. Au lieu de cela, par défaut, il téléchargera tout le code dansPROJECT_FOLDER/trunk
.svn mkdir --parents protocol: /// path / to / repo / PROJECT_FOLDER / trunk -m "create git repo placeholder"
C'est l'endroit où
trunk
à la fin du chemin est obligatoireInitialiser le
git-svn
contexte du plugin dans le.git
dossierC'est l'endroit où
trunk
à la fin du chemin est inutileRécupérer une
Subversion
information de référentiel videCette étape aide à synchroniser le serveur Subversion avec le
git-svn
plugin. C'est le moment où legit-svn
plugin établit leremotes/origin
chemin et l'associe autrunk
sous - dossier côté serveur.Rebase d'anciens commits Git se sont produits avant que le
git-svn
plugin ne soit impliqué dans le processus (cette étape est facultative )Ajouter des fichiers nouveaux / modifiés à valider (cette étape est régulière pour les activités Git et est facultative )
Validez les fichiers récemment ajoutés dans le référentiel Git local (cette étape est facultative et n'est applicable que si l'étape 7 a été utilisée):
Pousser tout l'historique des modifications du projet dans le serveur Subversion:
la source
Vous pouvez créer un nouveau référentiel SVN. Exportez votre projet Git (étoffez les fichiers .git). Ajoutez-le au référentiel SVN (initialisation du référentiel avec ce que vous aviez jusqu'à présent dans Git). Utilisez ensuite les instructions pour importer des référentiels SVN dans un nouveau projet Git.
Mais cela perdra votre historique Git précédent.
la source
Si vous n'avez pas besoin d'utiliser de SVN spécifique et que vous utilisez GitHub, vous pouvez utiliser leur connecteur SVN.
Plus d'informations sont ici: Collaboration sur GitHub avec Subversion
la source
Je voudrais partager un excellent outil utilisé dans la communauté WordPress appelé Scatter
Plugins Git WordPress et un peu de santé mentale
Cela permet aux utilisateurs d'envoyer automatiquement leur référentiel Git à wordpress.org SVN. En théorie, ce code peut être appliqué à n'importe quel référentiel SVN.
la source
J'ai récemment dû migrer plusieurs référentiels Git vers SVN, et après avoir essayé toutes les solutions que j'ai pu trouver, ce qui a finalement fonctionné pour moi a été Mercurial (oui, en utilisant un troisième VCS). En utilisant ce guide , j'ai trouvé le processus suivant (sous Linux, mais l'idée de base devrait également fonctionner sous Windows).
Les packages nécessaires:
Mercurial doit être configuré en ajoutant ce qui suit à
~/.hgrc
:Créez des répertoires de travail temporaires (j'avais plusieurs référentiels à migrer, j'ai donc créé des répertoires pour les versions SVN et Git, pour les garder séparés):
Créez un référentiel SVN local vide:
Clonez le référentiel Git existant:
Laissez Mercurial faire son travail:
Maintenant, le référentiel SVN devrait contenir l'historique complet des validations, mais pas avec les horodatages d'origine. Si ce n'est pas un problème, passez à l'étape suivante à l'étape 11.
Avec un peu de travail, la date et l'heure de chaque commit peuvent être modifiées . Étant donné que mes référentiels sont assez petits, il était possible pour moi de le faire manuellement. Tout d'abord, créez un
pre-revprop-change
hook dans le référentiel SVN avec le contenu suivant, pour permettre la modification de la propriété nécessaire:Ce script doit être rendu exécutable:
Mercurial a créé une copie de travail du référentiel SVN, nommée project -wc, alors passez-y et modifiez les temps de commit:
Entrez la date et l'heure correctes (faites attention aux fuseaux horaires!) Et enregistrez. Vous devriez recevoir un message disant "Définir une nouvelle valeur pour la propriété svn: date lors de la révision 1".
Maintenant, rincez et répétez pour chaque autre révision.
Vérifiez éventuellement l'historique des validations pour vous assurer que tout semble correct:
Remontez ensuite d'un niveau:
Vider le référentiel:
Et chargez le vidage sur votre serveur Subversion. Terminé!
Ce processus fonctionnerait probablement aussi directement entre les référentiels distants, mais j'ai trouvé plus facile de travailler avec des référentiels locaux. Fixer les temps de validation était beaucoup de travail, mais dans l'ensemble, le processus était beaucoup plus simple que toute autre méthode que j'ai trouvée.
la source
il existe trois méthodes:
rebaser: comme les autres réponses
commit id: trouver svn first commit id et git first commit id, les reproduire dans .git / info / grafts:
echo "git_id svn_id}" > .git/info/grafts
thengit svn dcommit
extraire chaque commit git, copier les fichiers dans svn_repo, svn commit
démo bash: démo github
v1.x : utiliser rebase et commit id
v2.x: utiliser des fichiers de copie, puis svn commit
la source
Dans mon cas, j'ai dû lancer un projet propre depuis SVN
ajoutez toutes vos sources de projet ...
la source
Je veux juste partager une partie de mon expérience avec la réponse acceptée. J'ai fait toutes les étapes et tout allait bien avant de lancer la dernière étape:
J'ai trouvé le fil https://github.com/nirvdrum/svn2git/issues/50 et enfin la solution que j'ai appliquée dans le fichier suivant à la ligne 101 /usr/lib/perl5/vendor_perl/5.22/Git/SVN.pm
j'ai remplacé
avec
Cela a résolu mon problème.
la source
Et si vous ne voulez pas engager tous les commit que vous faites dans Git, dans le dépôt SVN? Que se passe-t-il si vous souhaitez simplement envoyer des validations de manière sélective? Eh bien, j'ai une meilleure solution.
Je garde un référentiel Git local où tout ce que je fais est de récupérer et de fusionner depuis SVN. De cette façon, je peux m'assurer que j'inclus toutes les mêmes modifications que SVN, mais je garde mon historique de commit complètement séparé du SVN.
Ensuite, je garde une copie de travail locale SVN distincte qui se trouve dans un dossier séparé. C'est celui à partir duquel je valide à nouveau SVN, et j'utilise simplement l'utilitaire de ligne de commande SVN pour cela.
Lorsque je suis prêt à valider l'état de mon référentiel Git local sur SVN, je copie simplement tout le désordre des fichiers dans la copie de travail SVN locale et je le valide à partir de là en utilisant SVN plutôt que Git.
De cette façon, je n'ai jamais à effectuer de rebasage, car le rebasage est comme la base libre.
la source