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

Posted

技术标签:

【中文标题】如何 git-svn 从 Subversion 存储库克隆最后 n 个修订?【英文标题】:How to git-svn clone the last n revisions from a Subversion repository? 【发布时间】:2010-10-19 07:48:10 【问题描述】:

问题

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

如果您使用选项--depthgit 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 .

文档

git-clone

git-svn

【问题讨论】:

回答我自己的问题:-s is for --stdlayout which presumes the svn recommended layout for tags, trunk, and branches.(但对我不起作用) git svn 实施--depth 有多难,因为支持已经存在。它已经必须从服务器中找出最新的版本? 【参考方案1】:

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

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

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

【讨论】:

如果我想在未来继续克隆早期的版本,可以吗? @Zennichimaro:您可以通过添加另一个指向同一位置的git-svn 遥控器并使用git-svn fetch 来获取更多树。此时,您必须使用 git filter-branch 将旧(部分)树重新设置为正确的分支。 Paul 有什么方法可以让我通过执行从 SVN 到 Git 的增量迁移来获得最新版本 (***.com/questions/29161646/…) SVN 使用连续的整数来识别修订,使得回溯n 提交变得更加简单...... 我认为-r 后面少了一个空格。例如git svn clone -r 1133:HEAD some/svn/repo【参考方案2】:

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

【讨论】:

+1 来自我 - 帮助我解决了克隆整个 svn 存储库时出现的错误 128 问题 svn log 命令正是我想要的!谢谢 我使用的存储库具有非标准的分支和布局,因此我通常为每个 SVN 分支创建一个本地 Git 存储库,然后在它们之间创建cherry-pick/rebase。提交需要额外的步骤(push,然后是远程仓库的dcommit),但我认为值得权衡。 没想到,按照你说的克隆特定标签/分支可能会更快:)【参考方案3】:

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

【讨论】:

会试一试,我们的 repo 有大约 170,000 次修订,做一个项目需要很长时间,而且我在 repo 中有超过 10 个特定项目要做:|考虑只做3-4年的历史。 我 fork Jonathan 的想法,做了一些改进,并删除了对 Python 的依赖,可以在这里找到:github.com/jstine35/git-svn-cloneback

以上是关于如何 git-svn 从 Subversion 存储库克隆最后 n 个修订?的主要内容,如果未能解决你的问题,请参考以下文章

Git-svn:确定前面或后面的提交数量

Git-svn

git-svn — 让git和svn协同工作

Git 和 Team Foundation Server

git-svn 使用方式

将具有重命名中继历史的SVN仓库导入Git