git浅克隆到特定标记
我想克隆Linux内核repo,但只能从3.0版开始,因为内核repo太大了,如果我可以进行浅克隆,那么我的版本控制工具就会运行得更快。我问题的核心是:如何告诉git--depth参数的“n”值是多少?我希望这能奏效: git克隆--深度v3.0 谢谢。不幸的是,git浅克隆到特定标记,git,Git,我想克隆Linux内核repo,但只能从3.0版开始,因为内核repo太大了,如果我可以进行浅克隆,那么我的版本控制工具就会运行得更快。我问题的核心是:如何告诉git--depth参数的“n”值是多少?我希望这能奏效: git克隆--深度v3.0 谢谢。不幸的是,git clone的--depth参数只接受一个数字,即克隆存储库应该被截断的修订数 一种可能的解决方案是克隆整个存储库,然后截断其历史记录,以便仅在v3.0之后保留提交。以下是一个很好的操作方法: 请阅读全文以了解解决方案,但不幸的
git clone
的--depth
参数只接受一个数字,即克隆存储库应该被截断的修订数
一种可能的解决方案是克隆整个存储库,然后截断其历史记录,以便仅在v3.0之后保留提交。以下是一个很好的操作方法:
请阅读全文以了解解决方案,但不幸的是,git clone无法按照您所要求的方式工作。
--depth
参数限制修订的数量
而不是提交的数量
。没有限制提交量的克隆参数。在您的情况下,即使您知道在v3.0和回购协议中最新头部之间更改最多的文件最多只有10个版本差异,并且使用了--depth 10
,您仍然可以获得大部分或整个回购历史。因为有些对象可能没有多达10个修订版本,您可以将它们的历史记录一直追溯到它们在repo中首次出现的开始
下面是如何做您喜欢的事情:
问题的关键在于,您需要在v3.0和您想要的最新引用之间进行提交。以下是我为此所做的步骤:
git克隆http://git.kernel.org/pub/scm/linux/kernel/git/stable/linux-stable.git --深度10075更小的\u内核\u回购
cd较小的kerenel\u回购
- 确定v3.0
git日志的sha——oneline v3.0^..v3.0
- 从该sha开始创建移植点(它是02f8c6aee8df3cdc935e9bdd4f2d020306035dbe)
echo“02f8c6aee8df3cdc935e9bdd4f2d020306035dbe”>.git/info/grafts
- 要解决一些内核日志条目的问题,请执行以下操作:
和export GIT\u AUTHOR\u NAME=“tmp”
export GIT\u COMMITTER\u NAME=“tmp”
- 手册页中有一个很好的警告,关于通过以下移植点重写历史的git筛选器分支。。。现在让我们运行
,然后坐下来等待…(等待再等待)git filter branch
git reflog expire --expire=now --all
git repack -ad # Remove dangling objects from packfiles
git prune # Remove dangling loose objects
这个过程很耗时,但不是很复杂。希望它能为你节省所有你希望的时间。在这一点上,您将拥有一个从linux-stable.git repo开始仅修改了v3.0历史的repo。就像在克隆上使用--depth
一样,您对repo有相同的限制,并且只能修改和发送您已有的历史记录中的补丁。有很多方法可以解决这个问题。。但它应该有自己的问答
我自己正在测试最后几个步骤,但是git filter branch
操作仍然在进行。我会用任何问题更新这篇文章,但我会继续发布,这样如果你觉得可以接受,你就可以开始这个过程
更新
问题的解决方法(致命:不允许使用空标识)。这个问题源于linux repo的提交历史中的一个问题
将git过滤器分支
命令更改为:
git filter-branch --commit-filter '
if [ "$GIT_AUTHOR_EMAIL" = "" ];
then
GIT_AUTHOR_EMAIL="tmp@tmp";
GIT_AUTHOR_NAME='tmp'
GIT_COMMITTER_NAME='Me'
GIT_COMMITTER_EMAIL='me@me.com'
git commit-tree "$@";
else
git commit-tree "$@";
fi '
--depth
参数似乎只是一个数字(“指定的修订数量”),而不是一个标记
可能的想法(待测试):
您可以使用git description
从当前头部获取最近的标记,以及所述标记和头部之间的提交次数
如果“最新标记”不是您的标记,只需重复该过程,从该最新标记引用的提交开始,直到找到您的标记(例如,在您的示例中,v3.0
)
如果可以从当前的头部访问标记,那么所有这些提交编号的总和将为您提供给git clone
命令的深度,将标记克隆到深度为1如何
git克隆--分支mytag0.1--深度1https://example.com/my/repo.git
注:
--depth 1
意味着--single branch
,因此不会将来自其他分支的信息带到克隆的存储库中
- 如果要克隆本地存储库,请使用
文件://
,而不仅仅是存储库路径
对于已经拥有克隆的用户,此命令将获取当前分支尖端和标记之间的提交次数5.6
:
$ git rev-list HEAD ^5.6 --count
407
我发现这个项目使用GitHub API实现了版本列表:
上非常长的手册页表明幕后有很多事情要做。有许多不同的路径可以通过分支和合并来计算提交次数。对于这个用例,虽然这可能会被忽略(?),它应该和我提供的解决方案一样有效,但我也建议删除所有其他本地引用,并运行解决方案中的清理步骤。否则,回购协议仍将包含完整的历史记录和额外的对象。这一回购协议大约有200万个对象比需要的要多。这一策略需要管理冲突的合并,并且根据合并的处理方式,可能会产生最终主数据的不精确副本。由于回购规模如此之大,您不太可能手动进行合并,因此您可以在rebase命令中添加-Xours
或-Xtheirs
选项。我相信你会发现最终的结果与主参考的来源不同。请看,我认为在这里严格区分修订和提交过于复杂了。
$ git rev-list HEAD ^5.6 --count
407