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.

85
demandé sur kch 0000-00-00 00:00:00

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:

  1. Basculer le svn distant url réglage vers le nouveau nom.
  2. Exécuter git svn fetch . Cela nécessite au moins une nouvelle révision depuis svn!
  3. Change le paramètre svn-remote url qui renvoie à L'URL d'origine.
  4. 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).
  5. changer la commande svn-remote url retour à la nouvelle URL.
  6. Maintenant, git svn rebase devrait fonctionner à nouveau.

les âmes aventureuses peuvent vouloir essayer --rewrite-root .

59
répondu kch 2012-05-15 11:35:48

vous pouvez voir si le suivant fonctionne bien:

  1. si svn-remote.svn.rewriteRoot n'existe pas dans le fichier de configuration ( .git/config ):

    git config svn-remote.svn.rewriteRoot <currentRepositoryURL>
    
  2. 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 .

  3. git config svn-remote.svn.url <newRepositoryURL>

33
répondu H Krishnan 2015-11-05 23:42:24

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 (ou fetch 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 un git-svn-id pointant vers l'ancien chemin, qui ne correspond pas à celui trouvé dans .git/config .

  • comme solution de contournement, changez svn-remote url (ou fetch 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 que git svn ne sera pas confondu par le fait que le git-svn-id de la nouvelle tête ne correspond pas avec celle trouvée dans .git/config .

  • enfin, changer svn-remote url (ou fetch chemin) retour au nouveau domaine / url / chemin

  • à ce point git svn rebase devrait fonctionner à nouveau!

l'information originale a été trouvée ici .

20
répondu UncleZeiv 2011-11-15 12:28:26

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

3
répondu Adam Alexander 2012-05-15 11:41:19

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
2
répondu krlmlr 2016-08-17 06:07:18

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.

  1. Clone git_fast_filter de la Gitorious repo.
  2. 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 utilisant chmod +x . Adapter les anciens et les nouveaux chemins de référentiel. (Le contenu du script est aussi collé ci-dessous.)
  3. initialiser un nouveau dépôt cible en utilisant git init , changer le répertoire de travail à ce nouveau repo.
  4. 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
    
  5. Copie .git/config , et peut-être d'autres fichiers dans .git/info de l'ancien repo pour le nouveau repo.

  6. Supprimer .git/svn .
  7. Faire git-svn connaissance du nouveau numéro de la révision de la cartographie

    1. 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
    2. Exécuter git svn info . Si cette commande gèle, quelque chose ne va pas. Il devrait ré

1
répondu