Comment puis-je garder un svn:external à jour en utilisant git-svn?
traiter mon dépôt comme un SVN repo, je reçois:
svn co http://myrepo/foo/trunk foo
...
foo/
bar/
baz/ -> http://myrepo/baz/trunk
en le traitant comme un git repo, je comprends:
git svn clone http://myrepo/foo --trunk=trunk --branches=branches --tags=tags
...
foo/
bar/
je peux cloner baz sur ma machine locale ailleurs et Ajouter un lien symbolique, mais c'est juste un piratage. Est-ce qu'il y a un moyen d'avoir git svn rebase
automatiquement tirer dans ces changements quand il met à jour tout le reste, tout comme svn up
fait?
8 réponses
le meilleur moyen d'intégrer svn externals avec git-svn que j'ai vu est ce script , qui clone vos externes dans un .git_externals / directory et crée les liens symboliques et exclut les fichiers dont vous avez besoin. Je trouve cela d'une façon simple et directe de la solution. YMMV.
voici un ancien aperçu d'autres options pour traiter avec svn externals avec git-svn. Pour moi, ils ont l'air un peu trop compliqués et susceptibles de briser utilisation ultérieure de Git.
la solution que j'ai finalement utilisée était de faire un lien symbolique avec d'autres clones git-svn
sur ma boîte locale. Cela a plutôt bien fonctionné: cela m'a permis d'engager des changements en retour, et cela m'a permis de faire des changements locaux sur le projet A juste pour les faire entrer dans le projet B.
je viens d'écrire un script court qui vérifie tous les svn:externals
du HEAD
courant dans le répertoire racine et les exclut du dépôt 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]*\)$//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
}
j'ai aussi fait un script (à la fois Perl et Ruby variantes disponibles) qui fait cela pour moi, il est à http://github.com/liyanage/git-tools / .
- vérifie récursivement tous les svn: externals
- peut être lancé à plusieurs reprises au cas où le clone d'un grand dépôt s'arrête à mi-chemin. M'est arrivé beaucoup de choses. Il reprend là où il l'avait laissé.
- ajoute toutes les entrées svn:externals qu'il trouve et traite de. git/info/exclure
- ajoute tout svn: ignore les entrées qu'il rencontre .git/info/exclure
- peut être exécuté régulièrement après la première exécution pour faire le SVN: rebase dans toutes les boîtes de sous-sable clonées, découvrir de nouveaux externes et de nouveaux svn: ignore
mise à jour: Je ne maintiens plus ce script. Sa fonctionnalité de Clonage récursif et de mise à jour D'un dépôt SVN, ainsi que d'autres fonctionnalités liées à git, est disponible dans ce nouveau projet que je maintiens activement: http://liyanage.github.com/git-tools/
Juste pour le record: j'ai suivi ce suggestion et essayé d'utiliser SmartGit pour traiter les svn:externals
.
SmartGit est de loin le meilleur client GUI que j'ai jamais vu pour Git. En ce qui concerne svn:externals
, non seulement il les récupère correctement, mais il présente également la possibilité de faire un" instantané rapide " (clone en lecture seule, tête seule) des dépôts externes.
Malheureusement, il n'est pas gratuit pour utilisation commerciale (et j'ai trouvé le prix de la licence un peu trop élevé - Oui je suis un radin). Il peut être utilisé gratuitement à des fins non commerciales.
j'ai décidé d'écrire un script perl" simple " pour gérer tous ces trucs pour moi. Je l'ai mis récemment à github, essayer, 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 cherche récursivement, clones, symlinks eux dans les endroits appropriés et exclut tous .git_externals DRS et symlinks de sorte que vous pouvez toujours utiliser 'git svn dcommit'.
bonne chance.
essayez ce script python https://bitbucket.org/nytmyn/gitsvnext/overview
pour effectuer la commande svn externals, exécutez la commande suivante dans votre dépôt git
python /../gitsvnext/run update
exécuter ce savoir quoi mettre .git/info/exclure
python /../gitsvnext/run list
voilà ce que j'ai fait.
J'ai d'abord créé un SVN repo vide (pour la même racine que le git):
svn checkout --depth empty http://path/to/repo .
cela a créé un SVN repo vide dans la racine git. Le point est que is contient les propriétés externes de SVN.
ensuite je ne vérifie que les externes (j'ai placé dans les outils de chemin cygwin):
svn propget svn:externals | sed -e 's/ / .\//' | sed -e 's/\'//g' | xargs -L1 svn co