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
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.
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.
... 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