git浅克隆到特定标签

时间:2012-01-19 19:53:27

标签: git

我想克隆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

感谢。

5 个答案:

答案 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
  • 确定v3.0 [{1}}
  • 的sha
  • 从这个sha开始创建一个嫁接点(它是02f8c6aee8df3cdc935e9bdd4f2d020306035dbe)
  • git log --oneline v3.0^..v3.0
  • 要解决一些内核日志条目的问题:echo "02f8c6aee8df3cdc935e9bdd4f2d020306035dbe" > .git/info/graftsexport 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命令的深度。