问题
如何使用 git-svn 从 Subversion 存储库创建浅拷贝,例如,如何仅提取最后三个修订版?
如果您使用选项 --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
因此,我将 HEAD~3
替换为第三个但最后一个修订版 534 的实际编号。这有效,但这需要我首先找出第三个但最后一个提交的修订号。
$ git svn clone --prefix=svn/ -s -r534:HEAD http://some/svn/repo .
文档
-s is for --stdlayout which presumes the svn recommended layout for tags, trunk, and branches.
(但对我不起作用)
git svn
实施 --depth
会有多难,因为支持已经存在。它已经必须从服务器中找出最新的版本?
您已经发现了在 Git-SVN 中指定浅层克隆的最简单方法,即指定要在 (-r$REV:HEAD
) 处开始克隆的 SVN 修订号。
例如:git svn clone -s -r1450:HEAD some/svn/repo
Git 的数据结构基于有向无环图 (DAG) 中的指针,这使得回溯 n
提交变得微不足道。但是在 SVN(因此在 Git-SVN)中,您必须自己找到修订号。
我发现自己经常使用以下内容从我们巨大的颠覆树中获得有限数量的修订(我们很快就会达到 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 上。
cherry-pick
/rebase
。提交需要额外的步骤(push
,然后是远程仓库的 dcommit
),但我认为值得权衡。
... 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
我多次遇到错误“修订参数::git-svn不理解HEAD”
它通过增加修订限制的数量来工作
例如 100 而不是 50
./git-svn-cloneback.sh -u https://server/project/trunk -l 100 -o myproj --authors-file=svn-authors.txt
git-svn
遥控器并使用git-svn fetch
获取更多树来做到这一点。此时,您必须使用git filter-branch
将旧(部分)树重新设置到右分支上。n
提交变得更加简单......