Un dépôt svn que je mets en miroir via git-svn a changé d'URL.
Dans svn vanille, vous feriez juste svn switch --relocate old_url_base new_url_base
.
Comment puis-je faire cela en utilisant git-svn?
La simple modification de l'url svn dans le fichier de configuration échoue.
Réponses:
Cela gère assez bien ma situation:
https://git.wiki.kernel.org/index.php/GitSvnSwitch
J'ai cloné en utilisant le
file://
protocole et je voulais passer auhttp://
protocole.Il est tentant de modifier le
url
paramètre dans la[svn-remote "svn"]
section de.git/config
, mais cela ne fonctionne pas en soi. En général, vous devez suivre la procédure suivante:url
paramètre svn-remote sur le nouveau nom.git svn fetch
. Cela doit récupérer au moins une nouvelle révision de svn!url
paramètre svn-remote par l'URL d'origine.git svn rebase -l
pour effectuer un rebase local (avec les modifications apportées lors de la dernière opération d'extraction).url
paramètre svn-remote par la nouvelle URL.git svn rebase
devrait fonctionner à nouveau.Les âmes aventureuses voudront peut-être essayer
--rewrite-root
.la source
Vous pouvez voir si ce qui suit fonctionne bien:
Si
svn-remote.svn.rewriteRoot
n'existe pas dans le fichier de configuration (.git/config
):Si
svn-remote.svn.rewriteUUID
n'existe pas dans le fichier de configuration:Le
currentRepositoryUUID
peut être obtenu à partir de.git/svn/.metadata
.git config svn-remote.svn.url <newRepositoryURL>
la source
file://
, basculer verssvn+ssh
); en notant simplement que: cette procédure n'a pas besoin de "récupérer au moins une nouvelle révision de svn"; aussi./.git/svn/.metadata
after firstsvn rebase
contient le<newRepository>
asreposRoot
- mais cela ne suffit pas pour supprimer lesrewrite*
clés de.git/config
; donc ces clés devraient y être conservées en permanence, pour autant que je sache.svn+ssh://
et notre serveur svn vient de changer de domaine de.se
à.com
pour nettoyer notre dénomination interne.Malheureusement, la plupart des liens dans ces réponses ne fonctionnent pas, donc je vais dupliquer un peu d'informations du wiki git pour référence future.
Cette solution a fonctionné pour moi:
Modifiez le
svn-remote
url
(ou lefetch
chemin).git/config
pour pointer vers le nouveau domaine / url / cheminExécutez git
git svn fetch
. Cela doit récupérer au moins une nouvelle révision de svn!Si vous essayez
git svn rebase
maintenant, vous obtiendrez un message d'erreur comme celui-ci:Je pense que c'est parce que
git svn
c'est confus par le fait que votre dernier commit avant la récupération aura ungit-svn-id
pointant vers l'ancien chemin, qui ne correspond pas à celui trouvé dans.git/config
.Pour contourner le problème, modifiez
svn-remote
url
(ou lefetch
chemin) vers le domaine / l'url / le chemin d'origineMaintenant, exécutez à
git svn rebase -l
nouveau pour effectuer un rebase local avec les modifications apportées lors de la dernière opération d'extraction. Cette fois , il va travailler, apparemment parce quegit svn
ne sera pas confondu par le fait que legit-svn-id
de la nouvelle tête ne correspond pas à celle trouvée dans.git/config
.Enfin, changez
svn-remote
url
(oufetch
chemin) vers le nouveau domaine / url / cheminÀ ce stade,
git svn rebase
devrait fonctionner à nouveau!Les informations originales ont été trouvées ici .
la source
Git svn s'appuie fortement sur l'URL svn. Chaque commit importé de svn a un
git-svn-id
qui inclut l'URL svn.Une stratégie de relocalisation valide consiste à appeler
git-svn clone
le nouveau référentiel et à fusionner les modifications sur cette nouvelle clôture. Pour une procédure plus détaillée, consultez cet article:http://www.sanityinc.com/articles/relocating-git-svn-repositories
la source
git filter-branch
Ce script , tiré d' une entrée de blog , a fonctionné pour moi. Fournissez l'ancienne et la nouvelle URL du dépôt en tant que paramètre, comme pour
svn switch --relocate
.Le script appelle
git filter-branch
à remplacer les URL Subversion dans lesgit-svn-id
messages de validation, les mises à jour.git/config
et met également à jour lesgit-svn
métadonnées en les recréant à l'aide degit svn rebase
. Bien que celagit svn clone
puisse être la solution la plus robuste, l'filter-branch
approche fonctionne beaucoup plus rapidement pour d'énormes référentiels (heures par rapport aux jours).la source
git_fast_filter
Pourtant, plus rapide que
git-filter-branch
(c'est-à-dire des minutes au lieu d'heures), mais similaire dans l'esprit, est à utilisergit_fast_filter
. Cependant, cela nécessite un peu plus de codage, et aucune solution prête à l'emploi n'existe. Contrairement àgit-filter-branch
, cela créera un nouveau repo à partir d'un ancien . On suppose quemaster
pointe vers le dernier commit SVN.git_fast_filter
du repo Gitorious.git_fast_filter
fonction de ce Gist , définissez le bit exécutable à l'aide dechmod +x
. Adaptez les anciens et les nouveaux chemins de référentiel. (Le contenu du script est également collé ci-dessous.)git init
, remplacez le répertoire de travail par ce nouveau référentiel .Exécutez le tube suivant:
Copiez
.git/config
, et peut-être d'autres fichiers pertinents.git/info
de l'ancien référentiel vers le nouveau référentiel..git/svn
.Prenez
git-svn
connaissance du nouveau mappage des numéros de révisionExécuter
git branch refs/remotes/git-svn master
refs/remotes/git-svn
, consultez.git/config
,svn-remote
sectionsExécutez
git svn info
. Si cette commande se bloque, quelque chose ne va pas. Il devrait reconstruire le mappage des numéros de révision.Retirez la fausse branche
refs/remotes/git-svn
, elle sera recréée pargit-svn
git svn rebase
.Vous trouverez ci-dessous le contenu de
commit_filter.py
, remplacez les valeurs deIN_REPO
et,OUT_REPO
le cas échéant:la source
La
git svn rebase -l
solution ci-dessus n'a pas fonctionné pour moi. J'ai décidé de procéder différemment:old
et le nouveau SVN dans le repo gitnew
old
dansnew
cd new
git fetch ../old
git tag old FETCH_HEAD
new
au sommet deold
(devrait réussir car les arbres à la racinenew
et à la pointe deold
sont identiques)git checkout master
(Suppose que lamaster
branche pointe vers la tête SVN. Ce sera le cas avec un clone propre; sinon, dcommit avant de commencer.)git rebase --root --onto old
new
pour tenir compte du rebasegit update-ref --no-deref refs/remotes/git-svn master
(ajustez la référence de la télécommande en fonction de la façon dont vous avez cloné, par exemple, cela pourrait êtrerefs/remotes/svn/trunk
)rm -r .git/svn
git svn info
la source
Sur la base de certaines des autres réponses à cette question, j'ai mis au point un script Ruby qui gère le déplacement de git-svn. Vous pouvez le trouver sur https://gist.github.com/henderea/6e779b66be3580c9a584 .
Il gère le déplacement sans extraire une autre copie, et il gère même le cas où il y a des modifications non poussées dans une ou plusieurs branches (car cela rompt la logique régulière). Il utilise des éléments de la réponse git filter-branch (pour la logique principale) et la réponse sur la copie de branches d'une instance du dépôt vers une autre (pour copier des branches avec des modifications non poussées).
Je l'ai utilisé pour déplacer un tas de dépôts git-svn que j'ai pour le travail, et cette version du script (j'ai traversé d'innombrables itérations) semble fonctionner pour moi. Ce n'est pas très rapide, mais il semble gérer tous les cas que j'ai rencontrés et aboutir à un dépôt entièrement relocalisé.
Le script vous donne la possibilité de créer une copie du dépôt avant d'apporter des modifications, vous pouvez donc utiliser cette option pour créer une sauvegarde. La création d'une copie est requise si vous avez des modifications non poussées dans des branches.
Le script n'utilise pas de gemmes ou d'autres bibliothèques non incluses dans l'installation normale de MRI Ruby. Il utilise les bibliothèques readline et fileutils incluses dans l'IRM.
J'espère que mon script sera utile à quelqu'un d'autre. N'hésitez pas à apporter des modifications au script.
REMARQUE: je n'ai testé ce script qu'avec git 2.3.0 / 2.3.1 et Ruby 2.2.0 sur OS X 10.10 Yosemite (puisque c'est l'environnement que j'utilise), mais je m'attendrais à ce qu'il fonctionne également sur d'autres environnements. Aucune garantie sur Windows, cependant.
la source