web-dev-qa-db-fra.com

Comment git-svn cloner les n dernières révisions depuis un dépôt Subversion?

Problème

Comment créer une copie superficielle avec git-svn à partir d'un référentiel Subversion, par ex. comment ne tirez-vous que les trois dernières révisions?

La commande git clone peut obtenir les n dernières révisions d’un référentiel Git si vous utilisez l’option --depth, c’est-à-dire que vous obtenez une copie superficielle du référentiel. Exemple:

git clone --depth 3 git://some/repo myshallowcopyrepo

Existe-t-il une option similaire pour git-svn?

Mes découvertes jusqu'à présent

Jusqu'ici, je n'ai trouvé que l'option -rN, où N est la révision à extraire. Exemple:

git svn clone -rN svn://some/repo

Selon la documentation, il est possible d'utiliser -r$REVNUMBER:HEAD. J'ai essayé ce qui suit pour obtenir les 3 dernières révisions qui ont renvoyé un message d'erreur.

$ git svn clone --prefix=svn/ -s -rHEAD~3:HEAD http://some/svn/repo .
revision argument: HEAD~3:HEAD not understood by git-svn

J'ai donc remplacé HEAD~3 par le numéro réel de la troisième, dernière révision, 534. Cela a fonctionné, mais cela nécessite que je trouve d'abord le numéro de révision du troisième, dernier commit.

$ git svn clone --prefix=svn/ -s -r534:HEAD http://some/svn/repo .

Documentation

git-clone

git-svn

309
Lernkurve

Vous avez déjà découvert le moyen le plus simple de spécifier un clone superficiel dans Git-SVN en spécifiant le numéro de révision SVN sur lequel vous souhaitez démarrer votre clone (-r$REV:HEAD).

Par exemple: git svn clone -s -r1450:HEAD some/svn/repo

La structure de données de Git est basée sur des pointeurs dans un graphe acyclique dirigé (DAG), ce qui rend trivial le retour en arrière n commits. Mais dans SVN (et donc dans Git-SVN), vous devrez trouver le numéro de révision vous-même.

230
Paul

Je me retrouve souvent à utiliser ce qui suit pour extraire un nombre limité de révisions de notre énorme arbre Subversion (nous atteignons bientôt la révision 35000 de svn).

# checkout a specific revision
git svn clone -r N svn://some/repo/branch/some-branch
# enter it and get all commits since revision 'N'
cd some-branch
git svn rebase

Et un bon moyen de savoir où une branche a commencé est de faire un svn log et de trouver le premier sur la branche (le dernier répertorié lorsque vous le faites):

svn log --stop-on-copy svn://some/repo/branch/some-branch

Jusqu'à présent, je n'ai pas vraiment trouvé le souci qui en valait la peine dans le suivi de toutes les branches. Cela prend trop de temps à cloner et svn et git ne fonctionnent pas aussi bien que je le souhaiterais. J'ai tendance à créer des fichiers de correctifs et à les appliquer sur le clone git d'une autre branche svn.

89
Christian

... 7 ans plus tard, dans le désert, une herbe à tonneau souffle par ...

Je n'étais pas satisfait de la réponse acceptée, j'ai donc créé des scripts pour le faire pour vous disponible sur Github . Ceux-ci devraient aider tous ceux qui souhaitent utiliser git svn clone mais ne veulent pas cloner le référentiel entier et qui ne veulent pas rechercher une révision spécifique à cloner au milieu de l'historique (peut-être clonez-vous tas de repos). Ici, nous pouvons simplement cloner les N dernières révisions:

Utilisez git svn clone pour cloner les 50 dernières révisions

# -u    The SVN URL to clone
# -l    The limit of revisions
# -o    The output directory

./git-svn-cloneback.sh -u https://server/project/trunk -l 50 -o myproj --authors-file=svn-authors.txt

Trouver la révision N précédente à partir d'un dépôt SVN

# -u    The SVN URL to clone
# -l    The limit of revisions

./svn-lookback.sh -u https://server/project/trunk -l 5     
32
jonathan.cone