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
url
ré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
url
qui renvoie à L'URL d'origine. - Exécuter
git svn rebase -l
de faire un local rebase (avec les modifications qui sont venus avec la dernière opération d'extraction). - changer la commande svn-remote
url
retour à la nouvelle URL. - Maintenant,
git svn rebase
devrait fonctionner à nouveau.
les âmes aventureuses peuvent vouloir essayer --rewrite-root
.
vous pouvez voir si le suivant fonctionne bien:
-
si
svn-remote.svn.rewriteRoot
n'existe pas dans le fichier de configuration (.git/config
):git config svn-remote.svn.rewriteRoot <currentRepositoryURL>
-
si
svn-remote.svn.rewriteUUID
n'existe pas dans le fichier de configuration:git config svn-remote.svn.rewriteUUID <currentRepositoryUUID>
le
currentRepositoryUUID
peut ê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-remote
url
(oufetch
chemin d'accès) dans.git/config
pour 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 rebase
maintenant, vous obtiendrez un message d'erreur comme ceci:Unable to determine upstream SVN information from working tree history
je pense que c'est parce que
git svn
est confus par le fait que votre dernier commit avant le fetch aura ungit-svn-id
pointant vers l'ancien chemin, qui ne correspond pas à celui trouvé dans.git/config
. -
comme solution de contournement, changez
svn-remote
url
(oufetch
chemin) retour au domaine d'origine/url/chemin -
maintenant Lancez
git svn rebase -l
encore 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 svn
ne sera pas confondu par le fait que legit-svn-id
de la nouvelle tête ne correspond pas avec celle trouvée dans.git/config
. -
enfin, changer
svn-remote
url
(oufetch
chemin) retour au nouveau domaine / url / chemin -
à ce point
git svn rebase
devrait 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_filter
de la Gitorious repo. - créez un script Python dans le même répertoire où vous avez cloné
git_fast_filter
basé 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/info
de l'ancien repo pour le nouveau repo. - Supprimer
.git/svn
. -
Faire
git-svn
connaissance 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-remote
sections
- 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é
-