如何git-svn从Subversion仓库克隆最近的n个修订?


314

问题

如何从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

因此,我用HEAD~3第三个但最后一个修订版534的实际编号代替了。这行得通,但是这要求我首先弄清楚第三个但最后一次提交的修订版号。

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

文献资料

git克隆

git-svn


6
回答我自己的问题:(-s is for --stdlayout which presumes the svn recommended layout for tags, trunk, and branches.但对我
没用

它会很难实现--depthgit svn,因为支持已经存在。它已经必须从服务器中找出最新的版本?
彼得·科德斯

Answers:


238

通过在(-r$REV:HEAD)中指定要启动克隆的SVN版本号,您已经发现了在Git-SVN中指定浅表克隆的最简单方法。

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

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


5
如果我以后想继续克隆早期的版本,该怎么办?
Zennichimaro

5
@Zennichimaro:您可以通过git-svn在同一位置添加另一个远程指向并使用git-svn fetch以获取更多树来实现。在这一点上,您必须用于git filter-branch将旧的(部分)树重新放置到正确的分支上。
本杰克逊

保罗有什么办法,我通过SVN进行增量迁移到Git的(以获取最新版本stackoverflow.com/questions/29161646/...
SabareeshSS

1
SVN使用连续的整数来标识修订版本,从而使得回退n提交变得更加琐碎……
harm

我认为-r后缺少空格。例如git svn clone -r 1133:HEAD some / svn / repo
Gnana

92

我发现自己经常使用以下内容从庞大的Subversion树中获取有限数量的修订版(我们即将达到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克隆上。


1
从我+1-帮助我解决了一个错误128问题,我正在克隆整个svn存储库
Ian Oxley

svn log命令正是我想要的!谢谢
mrbrdo 2013年

1
与非标准的分支和布局,所以我一般创建一个本地的Git回购每个SVN分支,然后回购我的工作cherry-pick/ rebase那些之间。Commit采取了额外的步骤(push,然后dcommit从远程回购中),但是我认为值得进行权衡。
chronospoon

没想到,克隆特定的标签/分支可能会更快:)
VeenarM

33

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

我对接受的答案不满意,因此我创建了一些脚本可以在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     

可以解决这个问题,我们的仓库大约有170,000个修订版本,并且做一个项目花费的时间太长了,我在仓库中有10多个特定项目要做:考虑只做3-4年的历史。
VeenarM '18

1
感谢您分享!
Kai Mechel
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.