2008-12-08 9 views
51

Traiter mon dépôt comme repo SVN, je reçois:Comment garder svn: external à jour en utilisant git-svn?

svn co http://myrepo/foo/trunk foo 
... 
foo/ 
    bar/ 
    baz/ -> http://myrepo/baz/trunk 

Traiter comme un repo Git, je reçois:

git svn clone http://myrepo/foo --trunk=trunk --branches=branches --tags=tags 
... 
foo/ 
    bar/ 

Je peux cloner baz à ma machine locale ailleurs et ajouter un lien symbolique , mais c'est juste un hack. Y at-il un moyen d'avoir git svn rebase automatiquement tirer dans ces changements quand il met à jour tout le reste, tout comme svn up fait?

+0

Je sais que je l'ai lu quelque part sur la façon de le mettre en place avec des sous-modules git, mais je ne trouve pas le lien. – JesperE

Répondre

22

La solution que j'ai fini par utiliser était simplement de créer un lien symbolique vers d'autres clones git-svn sur ma boîte locale. Cela a très bien fonctionné: cela me permet de valider des changements, et cela me permet de faire des changements locaux sur le projet A juste pour les mettre dans le projet B.

24

Le meilleur moyen d'intégrer svn externals avec git-svn que j'ai vu est ce script, qui clone vos externes dans un répertoire .git_externals/et crée les liens symboliques et exclut les fichiers dont vous avez besoin. Je trouve cela une solution simple et directe. YMMV.

Voici une autre older overview d'autres options pour traiter svn externals avec git-svn. Pour moi, ils semblent un peu trop compliqués et susceptibles de se briser sous l'utilisation ultérieure de Git.

+0

Cela ne semble pas fonctionner pour moi (ici les externes sont des liens relatifs au même référentiel). –

1

J'ai décidé d'écrire un script Perl "simple" pour gérer tout ça des trucs pour moi. Je l'ai mis récemment à github, essayez-le, peut-être que cela aiderait: http://github.com/sushdm/git_svn_externals/.

Il fait essentiellement git-svn clone pour tous les externes trouvés, et il les recherche récursivement, les clone, les lie symétriquement et exclut tous les répertoires .git_externals et les liens symboliques afin que vous puissiez toujours utiliser 'git svn dcommit'.

Bonne chance.

4

J'ai également fait un script (les deux variantes Perl et Ruby disponibles) qui fait cela pour moi, c'est au http://github.com/liyanage/git-tools/.

  • vérifie récursive toutes svn: externals
  • peut être exécuté de façon répétée dans le cas où le clone d'un grand dépôt avorte à mi-chemin. Cela m'est arrivé beaucoup. Il reprend là où il s'était arrêté.
  • permet d'ajouter tous svn: externals entrées qu'il trouve et processus à .git/info/exclure
  • permet d'ajouter tous svn: ignorer les entrées qu'il rencontre à .git/info/exclure
  • peut être exécuté régulièrement après la première manche à faire le svn: rebasage dans tous les sous-clonés sandboxes, découvrir de nouveaux et de nouvelles svn externals: ne tient pas compte

Mise à jour: Je ne suis plus maintenais ce script. Ses fonctionnalités de clonage récursif et de mise à jour d'un référentiel SVN, ainsi que d'autres fonctionnalités git, sont disponibles dans ce nouveau projet que je maintiens activement: http://liyanage.github.com/git-tools/

+0

Je n'arrivais malheureusement pas à faire fonctionner vos outils. –

+1

Je voudrais apprendre ce qui n'a pas fonctionné pour vous afin que je puisse améliorer le script. Pouvez-vous me contacter? –

+0

Il y a beaucoup de fourchettes. Est-ce que quelqu'un sait lequel d'entre eux travaille sur Windows avec msysgit? La version liée se bloque juste. – axk

4

Je viens d'écrire un court script qui passe en revue tous les svn:externals actuels HEAD dans le répertoire racine et les exclut du référentiel git.

Placez-le à .git/hooks/post-checkout et il gardera ces vérifications externes à jour chaque fois que l'arbre de travail change, par exemple en raison de git svn rebase ou git-checkout.

#!/bin/bash 
set -eu 

revision=$(git svn info | sed -n 's/^Revision: \([1-9][0-9]*\)$/\1/p') 
git svn -r${revision} propget svn:externals | head -n-1 | { 
    while read checkout_args 
    do 
     checkout_dirname=$(echo ${checkout_args} | cut -d' ' -f3) 
     svn checkout ${checkout_args} 
     if [ -z $(grep ${checkout_dirname} .git/info/exclude) ] 
     then 
      echo ${checkout_dirname} >> .git/info/exclude 
     fi 
    done 
} 
+1

+1 pour quelque chose qui fonctionne presque sur windows git. J'ai dû le modifier un peu, mais c'est la meilleure solution ici pour Windows. – pms1969

+1

@ pms1969: Source pour la version modifiée? – Carl

1

essayer ce script python https://bitbucket.org/nytmyn/gitsvnext/overview

à la caisse svn externals run suivant dans votre dépôt git

python /../gitsvnext/run update 

lancer pour savoir quoi mettre à .git/info/exclure

python /../gitsvnext/run list 
+0

Dans quel dossier exécuteriez-vous ce service? Si mon référentiel svn principal est/path/to/repo et que les externes sont définis dans/path/to/repo/myexternals/folder/alors devrais-je lancer le script dans/path/to/repo ou myexternals/folder? – bibstha

2

Juste pour la notice: J'ai suivi this et essayé en utilisant SmartGit pour traiter svn:externals. SmartGit est de loin le meilleur client GUI que j'ai jamais vu pour Git. En ce qui concerne svn:externals, il les récupère non seulement correctement, mais présente également la possibilité de faire un "instantané rapide" (clone HEAD seulement) des dépôts externes.

Malheureusement, il n'est pas gratuit pour un usage commercial (et j'ai trouvé le prix de la licence un peu trop élevé - oui, je suis un cheappskate). Il peut être utilisé gratuitement à des fins non commerciales si.

0

Voici ce que j'ai fait.

D'abord, je créé un repo SVN vide (pour la même racine que le git):

svn checkout --depth empty http://path/to/repo . 

Cela a créé repo vide svn dans la racine git. Le point est que contient les propriétés externes SVN.

Ensuite, je vérifie simplement que les externals (j'ai placé dans les outils PATH Cygwin):

svn propget svn:externals | sed -e 's//.\//' | sed -e 's/\'//g' | xargs -L1 svn co 
Questions connexes