Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/git/25.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/0/azure/13.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
git浅克隆到特定标记_Git - Fatal编程技术网

git浅克隆到特定标记

git浅克隆到特定标记,git,Git,我想克隆Linux内核repo,但只能从3.0版开始,因为内核repo太大了,如果我可以进行浅克隆,那么我的版本控制工具就会运行得更快。我问题的核心是:如何告诉git--depth参数的“n”值是多少?我希望这能奏效: git克隆--深度v3.0 谢谢。不幸的是,git clone的--depth参数只接受一个数字,即克隆存储库应该被截断的修订数 一种可能的解决方案是克隆整个存储库,然后截断其历史记录,以便仅在v3.0之后保留提交。以下是一个很好的操作方法: 请阅读全文以了解解决方案,但不幸的

我想克隆Linux内核repo,但只能从3.0版开始,因为内核repo太大了,如果我可以进行浅克隆,那么我的版本控制工具就会运行得更快。我问题的核心是:如何告诉git--depth参数的“n”值是多少?我希望这能奏效:

git克隆--深度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