git浅层克隆到特定标记

qmelpv7a  于 2022-11-20  发布在  Git
关注(0)|答案(5)|浏览(135)

我想克隆Linux内核repo,但只能从版本3.0开始,因为内核repo太大了,如果我能进行浅层克隆,我的版本控制工具会运行得更快。我的核心问题是:我如何告诉git--depth参数的“n”值是多少?我希望这样可以:
git克隆http://git.kernel.org/pub/scm/linux/kernel/git/stable/linux-stable.git--深度v3.0
谢谢你的好意。

gorkyyrv

gorkyyrv1#

tag克隆到深度为1如何?

  • git clone --branch mytag0.1 --depth 1 https://example.com/my/repo.git

备注:

  • --depth 1意味着--single-branch,因此没有来自其他分支的信息被带到克隆的存储库中
  • 如果要克隆本地存储库,请使用file://,而不仅仅是存储库路径
pokxtpni

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
  • 确定v3.0git log --oneline v3.0^..v3.0的sha
  • 以此sha(其为02 f8 c6 aee 8df 3cdc 935 e9 bdd 4f 2d 020306035 dbe)开始创建移植点
  • echo "02f8c6aee8df3cdc935e9bdd4f2d020306035dbe" > .git/info/grafts
  • 要解决某些内核日志条目的问题,请执行以下操作:export GIT_AUTHOR_NAME="tmp"export GIT_COMMITTER_NAME="tmp"
  • 在手册页中有一个很好的警告,关于git filter-branch通过以下移植点重写历史...所以让我们滥用它,现在运行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到3.0版本的修改后的repo。就像在克隆上使用--depth一样,您在存储库上也有相同的限制,并且只能修改和发送您已创建的历史记录中的修补程序有。有办法绕过这一点。。但它值得自己的问答。
我自己正在测试最后几个步骤,但是git filter-branch操作仍在进行中。我会更新这篇文章,如果你觉得可以接受的话,我会继续发布它,这样你就可以开始这个过程了。

  • 更新 *

问题的解决方法(致命错误:不允许空的ident〈〉)。这个问题源于linux repo的提交历史记录中的一个问题。
git filter-branch命令更改为:

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 '
js4nwp54

js4nwp543#

对于已经拥有克隆的用户,此命令将获取当前分支的tip和标记v5.2之间的提交次数:

$ git rev-list HEAD ^v5.2 --count
407

我发现这个项目使用GitHub API实现rev-list:https://github.com/cjlarose/github-rev-list
关于rev-list的非常长的手册页表明在幕后有很多事情在进行。有很多不同的路径来计算提交,通过分支和合并来进行。但是对于这个用例,这可能可以忽略(?)

toiithl6

toiithl64#

不幸的是,git clone--depth参数只接受一个数字,即克隆仓库应该被截断的修订版本数。
一个可能的解决方案是克隆整个仓库,然后截断它的历史记录,只保留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
qyswt5oh

qyswt5oh5#

--depth参数似乎只是一个数字(“指定的修订 * 数量 *”),而不是一个标记。
可能的想法(待测试):
你可以使用git describe来从你当前的HEAD中获取最近的标签,以及所述标签和HEAD之间的提交次数。
如果“最近的标签”不是你的标签,只需重复这个过程,从最近的标签引用的提交开始,直到你找到你的标签(例如在你的例子中是v3.0)。
所有这些提交数的总和将为git clone命令提供深度,前提是您的标记可以从当前的HEAD访问。

相关问题