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

时间:2009-04-14 10:58:07

标签: git svn git-svn git-clone svn-checkout

问题

如何使用Subversion存储库中的git-svn创建浅表副本,例如:你怎么只拉最后三个版本?

如果您使用选项git clone--depth命令可以从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

3 个答案:

答案 0 :(得分:230)

您已经发现了在Git-SVN中指定浅层克隆的最简单方法,方法是在(-r$REV:HEAD)指定要开始克隆的SVN修订版号。

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

Git的数据结构基于有向非循环图(DAG)中的指针,这使得返回n提交变得微不足道。但是在SVN中(因此在Git-SVN中)你必须自己找到修订号。

答案 1 :(得分:89)

我发现自己经常使用以下内容从我们庞大的颠覆树中获得有限数量的修订(我们很快就会达到svn修订版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 clone。

答案 2 :(得分:30)

... ... 7年后,在沙漠中,风滚草吹来......

我对接受的答案不满意所以我创建了一些脚本来为你available on 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回购中找到以前的N版本

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

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