我想克隆Linux内核repo,但仅从3.0版开始,因为内核repo如此庞大,如果我可以做一个浅层克隆,我的版本控制工具运行得更快。我的问题的核心是:我如何告诉git --depth参数的“n”值是什么?我希望这会奏效:
git clone http://git.kernel.org/pub/scm/linux/kernel/git/stable/linux-stable.git --depth v3.0
感谢。
答案 0 :(得分:50)
如何将标签克隆到1的深度?
git clone --branch mytag0.1 --depth 1 https://example.com/my/repo.git
注意:
--depth 1
暗示--single-branch
,因此其他分支的信息不会被带到克隆的存储库file://
而不是仅使用存储库路径答案 1 :(得分:7)
完全阅读解决方案,但不幸的是,git clone无法按照您要求的方式运行。 --depth
参数限制revisions
的数量,而不是commits
的数量。没有克隆参数限制提交量。在您的情况下,即使您知道文件中最多只有10个修订版差异在v3.0和repo中最新的HEAD之间发生了最大的变化,并且使用了--depth 10
,您仍然可以获得最多或者整个回购历史。因为某些对象可能没有多达10个修订版本,您将获得他们的历史记录,直到他们首次出现在回购站的开头。
现在这里是你喜欢做的事情: 您的问题的关键是您需要在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
要解决一些内核日志条目的问题:echo "02f8c6aee8df3cdc935e9bdd4f2d020306035dbe" > .git/info/grafts
和
export GIT_AUTHOR_NAME="tmp"
关于export GIT_COMMITTER_NAME="tmp"
重写历史的手册页中有一个很好的警告:关注贪污点...所以让我们滥用它,现在运行git filter-branch
并坐下来等待.. (等待等待)
现在你需要清理所有东西:
git filter-branch
这个过程耗时但不是很复杂。希望从长远来看,它会一直拯救你。在这一点上,你将拥有一个基本上是一个回购,其中只有v3.0以上的修订历史从linux-stable.git repo开始。就像在克隆上使用git reflog expire --expire=now --all
git repack -ad # Remove dangling objects from packfiles
git prune # Remove dangling loose objects
一样,您对repo具有相同的限制,并且只能从您已有的历史记录中修改和发送补丁。有办法解决这个问题......但是它应该有自己的Q& A。
我正在测试自己的最后几个步骤,但--depth
操作仍在继续。我会更新这篇文章有任何问题,但我会继续并发布,以便你可以开始这个过程,如果你觉得它可以接受。
更新
问题的解决方法(致命:空标识<>不允许)。这个问题源于linux repo的提交历史中的一个问题。
将git filter-branch
命令更改为:
git filter-branch
答案 2 :(得分:2)
不幸的是--depth
git clone
参数只接受一个数字,即应该截断克隆存储库的修订数量。
一种可能的解决方案是克隆整个存储库,然后截断其历史记录,以便仅在v3.0之后保留提交。这是一个很好的操作方法: http://bogdan.org.ua/2011/03/28/how-to-truncate-git-history-sample-script-included.html
git checkout --orphan temp v3.0
git commit -m "Truncated history"
git rebase --onto temp v3.0 master
git branch -D temp
git gc
答案 3 :(得分:2)
对于已经拥有克隆的人,此命令将获取当前分支的提示与标记5.6
之间的提交次数:
$ git rev-list HEAD ^5.6 --count
407
我发现这个项目使用GitHub API实现rev-list: https://github.com/cjlarose/github-rev-list
rev-list上非常冗长的手册页表明幕后有很多事情要发生。有许多不同的路径可以计算通过分支和合并进出的提交。对于这个用例,虽然可以忽略(?)
答案 4 :(得分:0)
--depth
参数似乎只是一个数字(“指定的数字修订版”),而不是标记。
可能的想法(待测试):
您可以使用git describe
来获取当前HEAD的最新标记,以及所述标记与HEAD
之间的提交次数。
如果“最新标记”不是您的标记,只需重复该过程,从最新标记引用的提交开始,直到找到您的标记(例如,v3.0
)。
如果您的标记可以从当前git clone
访问,则所有这些提交数字的总和将为您提供HEAD
命令的深度。