我想克隆Linux内核repo,但只能从版本3.0开始,因为内核repo太大了,如果我能进行浅层克隆,我的版本控制工具会运行得更快。我的核心问题是:我如何告诉git--depth参数的“n”值是多少?我希望这样可以:
git克隆http://git.kernel.org/pub/scm/linux/kernel/git/stable/linux-stable.git--深度v3.0
谢谢你的好意。
我想克隆Linux内核repo,但只能从版本3.0开始,因为内核repo太大了,如果我能进行浅层克隆,我的版本控制工具会运行得更快。我的核心问题是:我如何告诉git--depth参数的“n”值是多少?我希望这样可以:
git克隆http://git.kernel.org/pub/scm/linux/kernel/git/stable/linux-stable.git--深度v3.0
谢谢你的好意。
5条答案
按热度按时间gorkyyrv1#
将tag克隆到深度为1如何?
git clone --branch mytag0.1 --depth 1 https://example.com/my/repo.git
备注:
--depth 1
意味着--single-branch
,因此没有来自其他分支的信息被带到克隆的存储库中file://
,而不仅仅是存储库路径pokxtpni2#
请阅读全文以获得解决方案,但不幸的是,git clone并不像您所要求的那样工作。
--depth
参数限制了revisions
的数量,而不是commits
的数量。没有clone参数限制提交的数量。在您的情况下,即使您知道与v3之间更改最多的文件最多只有10个修订版差异。0和repo中最新的HEAD,并使用--depth 10
,您仍然可以获得大部分或整个repo历史记录。因为有些对象可能没有多达10个修订,您将获得它们的历史记录,一直追溯到它们在repo中首次出现的开始。下面是如何做你喜欢的:问题的关键在于你需要v3.0和最近的引用之间的提交。下面是我为实现这一点所做的步骤:
git clone http://git.kernel.org/pub/scm/linux/kernel/git/stable/linux-stable.git --depth 10075 smaller_kernel_repo
cd smaller_kerenel_repo
git log --oneline v3.0^..v3.0
的shaecho "02f8c6aee8df3cdc935e9bdd4f2d020306035dbe" > .git/info/grafts
export GIT_AUTHOR_NAME="tmp"
和export GIT_COMMITTER_NAME="tmp"
git filter-branch
通过以下移植点重写历史...所以让我们滥用它,现在运行git filter-branch
,坐下来等待...(等待和等待)现在您需要清理所有内容:
这个过程很耗时,但并不复杂。希望它能为你节省所有的时间,从长远来看,你会得到一个从linux-stable.git到3.0版本的修改后的repo。就像在克隆上使用
--depth
一样,您在存储库上也有相同的限制,并且只能修改和发送您已创建的历史记录中的修补程序有。有办法绕过这一点。。但它值得自己的问答。我自己正在测试最后几个步骤,但是
git filter-branch
操作仍在进行中。我会更新这篇文章,如果你觉得可以接受的话,我会继续发布它,这样你就可以开始这个过程了。问题的解决方法(致命错误:不允许空的ident〈〉)。这个问题源于linux repo的提交历史记录中的一个问题。
将
git filter-branch
命令更改为:js4nwp543#
对于已经拥有克隆的用户,此命令将获取当前分支的tip和标记
v5.2
之间的提交次数:我发现这个项目使用GitHub API实现rev-list:https://github.com/cjlarose/github-rev-list
关于rev-list的非常长的手册页表明在幕后有很多事情在进行。有很多不同的路径来计算提交,通过分支和合并来进行。但是对于这个用例,这可能可以忽略(?)
toiithl64#
不幸的是,
git clone
的--depth
参数只接受一个数字,即克隆仓库应该被截断的修订版本数。一个可能的解决方案是克隆整个仓库,然后截断它的历史记录,只保留v3.0之后的提交。http://bogdan.org.ua/2011/03/28/how-to-truncate-git-history-sample-script-included.html
qyswt5oh5#
--depth
参数似乎只是一个数字(“指定的修订 * 数量 *”),而不是一个标记。可能的想法(待测试):
你可以使用
git describe
来从你当前的HEAD中获取最近的标签,以及所述标签和HEAD
之间的提交次数。如果“最近的标签”不是你的标签,只需重复这个过程,从最近的标签引用的提交开始,直到你找到你的标签(例如在你的例子中是
v3.0
)。所有这些提交数的总和将为
git clone
命令提供深度,前提是您的标记可以从当前的HEAD
访问。