如何git-svn从Subversion存储库克隆最后n个修订?

问题

如何从Subversion存储库中使用git-svn创建一个浅拷贝,例如,如何只提取最后三个修订?

如果你使用--depth选项,git clone命令可以从Git存储库中获得最近的n个修订,也就是说,你获得了存储库的浅拷贝。例子:

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

git-svn是否有类似的选项?

我目前的发现

到目前为止,我只找到了-rN选项,其中N是要拉的修订。例子:

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

根据文档,有可能使用-r$REVNUMBER:HEAD。我尝试下面的3个版本,返回一个错误消息。

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

所以我用第三次也是最后一次修订534的实际数字替换了HEAD~3。这是有效的,但这要求我首先计算出第三次(也是最后一次)提交的修订号。

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

文档

git-clone

git-svn . sh . sh

148188 次浏览

您已经发现了在Git-SVN中指定浅克隆的最简单方法,即指定您想要在(-r$REV:HEAD)处启动克隆的SVN修订号。

例如:git svn clone -s -r1450:HEAD some/svn/repo

Git的数据结构基于有向无环图(DAG)中的指针,这使得回溯n提交变得很简单。但是在SVN中(因此在Git-SVN中),您必须自己找到修订号。

我发现自己经常使用以下方法从我们巨大的subversion树中获得有限数量的修订(我们很快就会达到svn revision 35000)。

# 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

找到分支开始位置的一个好方法是执行svn log,并找到分支上的第一个(执行时列出的最后一个):

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

到目前为止,我还没有发现跟踪所有分支的麻烦。它需要太多的时间来克隆和svn和git不像我想的那样一起工作。我倾向于创建补丁文件,并将它们应用到另一个svn分支的git克隆上。

... 七年后,在沙漠中,风滚草吹过……

我不满意接受的答案,所以我创建了一些脚本来为你可以在Github上找到。这些应该可以帮助那些想要使用git svn clone,但不想克隆整个存储库,也不想在历史记录中间寻找要克隆的特定修订的人(也许你正在克隆一堆回购)。这里我们可以克隆最后的N个修订:

使用git svn clone来克隆最近的50个修订

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

从SVN repo中查找前N个修订

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


./svn-lookback.sh -u https://server/project/trunk -l 5
这个错误我已经犯了好几次了

.修改参数::HEAD not understand by git-svn"

它通过增加修订限制的数量来工作

例如,100而不是50

./git-svn-cloneback.sh -u https://server/project/trunk -l 100 -o myproj——authors-file = svn-authors.txt < / p >

enter image description here

尝试了SVN存储库选项中的tortoisegit工具,它为我工作。