ChatGPT解决这个技术问题 Extra ChatGPT

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

问题

如何使用 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 会有多难,因为支持已经存在。它已经必须从服务器中找出最新的版本?

T
TamaMcGlinn

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

例如: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 的增量迁移来获得最新的修订版 (stackoverflow.com/questions/29161646/…)
SVN 使用连续整数来识别修订,使得回溯 n 提交变得更加简单......
我认为-r之后缺少一个空格。例如 git svn clone -r 1133:HEAD some/svn/repo
C
Christian

我发现自己经常使用以下内容从我们巨大的颠覆树中获得有限数量的修订(我们很快就会达到 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),但我认为值得权衡。
没想到这一点,就像你说的那样克隆特定的标签/分支可能会更快:)
j
jonathan.cone

... 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年的历史。
我分叉了 Jonathan 的想法,进行了一些改进,并删除了对 Python 的依赖,可在此处获得:github.com/jstine35/git-svn-cloneback
9
936940

我多次遇到错误“修订参数::git-svn不理解HEAD”

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

例如 100 而不是 50

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