git-svn: Quel est l'équivalent de 'svn switch -- relocate'?
un dépôt svn que je crée en miroir par git-svn a changé D'URL.
dans vanilla svn, vous feriez svn switch --relocate old_url_base new_url_base .
Comment faire avec git-svn?
changer simplement l'url svn dans le fichier de configuration échoue.
6 réponses
Cela gère ma situation assez bien:
https://git.wiki.kernel.org/index.php/GitSvnSwitch
j'ai cloné en utilisant le protocole file:// , et j'ai voulu passer au protocole http:// .
il est tentant d'éditer le paramètre url dans la section [svn-remote "svn"] de .git/config , mais en soi cela ne fonctionne pas. En général, vous devez suivre les étapes suivantes procédure:
- Basculer le svn distant
urlréglage vers le nouveau nom. - Exécuter
git svn fetch. Cela nécessite au moins une nouvelle révision depuis svn! - Change le paramètre svn-remote
urlqui renvoie à L'URL d'origine. - Exécuter
git svn rebase -lde faire un local rebase (avec les modifications qui sont venus avec la dernière opération d'extraction). - changer la commande svn-remote
urlretour à la nouvelle URL. - Maintenant,
git svn rebasedevrait fonctionner à nouveau.
les âmes aventureuses peuvent vouloir essayer --rewrite-root .
vous pouvez voir si le suivant fonctionne bien:
-
si
svn-remote.svn.rewriteRootn'existe pas dans le fichier de configuration (.git/config):git config svn-remote.svn.rewriteRoot <currentRepositoryURL> -
si
svn-remote.svn.rewriteUUIDn'existe pas dans le fichier de configuration:git config svn-remote.svn.rewriteUUID <currentRepositoryUUID>le
currentRepositoryUUIDpeut être obtenu à partir de.git/svn/.metadata. -
git config svn-remote.svn.url <newRepositoryURL>
malheureusement la plupart des liens dans ces réponses ne fonctionnent pas, donc je vais dupliquer un peu d'information du wiki git pour référence future.
Cette solution a fonctionné pour moi:
-
Modifier
svn-remoteurl(oufetchchemin d'accès) dans.git/configpour pointer vers le nouveau domaine / url/chemin -
Exécuter git
git svn fetch. cela doit rapporter au moins une nouvelle révision à svn! -
si vous essayez
git svn rebasemaintenant, vous obtiendrez un message d'erreur comme ceci:Unable to determine upstream SVN information from working tree historyje pense que c'est parce que
git svnest confus par le fait que votre dernier commit avant le fetch aura ungit-svn-idpointant vers l'ancien chemin, qui ne correspond pas à celui trouvé dans.git/config. -
comme solution de contournement, changez
svn-remoteurl(oufetchchemin) retour au domaine d'origine/url/chemin -
maintenant Lancez
git svn rebase -lencore une fois pour faire un rebase local avec les changements qui sont venus avec la dernière opération fetch. Cette fois, il va travailler, apparemment parce quegit svnne sera pas confondu par le fait que legit-svn-idde la nouvelle tête ne correspond pas avec celle trouvée dans.git/config. -
enfin, changer
svn-remoteurl(oufetchchemin) retour au nouveau domaine / url / chemin -
à ce point
git svn rebasedevrait fonctionner à nouveau!
l'information originale a été trouvée ici .
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 est d'appeler git-svn clone sur le nouveau dépôt et de fusionner les changements sur cette nouvelle fermeture. Pour une procédure plus détaillée, voir cet article:
http://www.sanityinc.com/articles/relocating-git-svn-repositories
git filter-branch
ce script , tiré de une entrée de blog , a fonctionné pour moi. Fournit L'ancienne et la nouvelle URL repo comme paramètre, comme pour svn switch --relocate .
le script appelle git filter-branch pour remplacer les URLs Subversion dans les git-svn-id dans les messages de propagation, les mises à jour .git/config , et aussi les mises à jour git-svn en le recréant en utilisant git svn rebase . Alors que git svn clone peut-être la solution la plus robuste, l'approche filter-branch fonctionne beaucoup plus rapidement pour les dépôts énormes (heures vs. jours).
#!/bin/sh
# Must be called with two command-line args.
# Example: git-svn-relocate.sh http://old.server https://new.server
if [ $# -ne 2 ]
then
echo "Please invoke this script with two command-line arguments (old and new SVN URLs)."
exit $E_NO_ARGS
fi
# Prepare URLs for regex search and replace.
oldUrl=`echo | awk '{gsub("[\\.]", "\\\\&");print}'`
newUrl=`echo | awk '{gsub("[\\&]", "\\\\&");print}'`
filter="sed \"s|^git-svn-id: $oldUrl|git-svn-id: $newUrl|g\""
git filter-branch --msg-filter "$filter" -- --all
sed -i.backup -e "s|$oldUrl|$newUrl|g" .git/config
rm -rf .git/svn
git svn rebase
git_fast_filter
encore plus rapide que git-filter-branch (c.-à-d., minutes au lieu d'heures), mais semblable dans l'esprit, est d'utiliser git_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 va créer un nouvelle repo vieux . Il est supposé que master pointe vers le dernier SVN engager.
- Clone
git_fast_filterde la Gitorious repo. - créez un script Python dans le même répertoire où vous avez cloné
git_fast_filterbasé sur ce Gist , définissez le bit exécutable en utilisantchmod +x. Adapter les anciens et les nouveaux chemins de référentiel. (Le contenu du script est aussi collé ci-dessous.) - initialiser un nouveau dépôt cible en utilisant
git init, changer le répertoire de travail à ce nouveau repo. -
exécuter le tuyau suivant:
(cd path/to/old/repo && git-fast-export --branches --tags --progress=100) | \ path/to/git_fast_filter/commit_filter.py | git-fast-import -
Copie
.git/config, et peut-être d'autres fichiers dans.git/infode l'ancien repo pour le nouveau repo. - Supprimer
.git/svn. -
Faire
git-svnconnaissance du nouveau numéro de la révision de la cartographie-
Exécuter
git branch refs/remotes/git-svn master- vos télécommandes git-svn pourraient être appelées autrement que
refs/remotes/git-svn, consultez.git/config,svn-remotesections
- vos télécommandes git-svn pourraient être appelées autrement que
-
Exécuter
git svn info. Si cette commande gèle, quelque chose ne va pas. Il devrait ré
-