我想克隆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
谢谢.
n8h*_*rie 59
如何将标签克隆到1的深度?
git clone --branch mytag0.1 --depth 1 https://example.com/my/repo.git
笔记:
--depth 1
暗示--single-branch
,因此其他分支的信息不会被带到克隆的存储库中file://
而不是仅存储库路径完全阅读解决方案,但不幸的是,git clone无法按照您要求的方式工作.该--depth
参数限制的数量revisions
不是数量commits
.没有克隆参数限制提交量.在您的情况下,即使您知道文件中最多只有10个修订版差异在v3.0和回购中的最新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
并坐下来等待...(等待等待)
现在你需要清理一切:
git reflog expire --expire=now --all
git repack -ad # Remove dangling objects from packfiles
git prune # Remove dangling loose objects
Run Code Online (Sandbox Code Playgroud)
这个过程耗时但不是很复杂.希望从长远来看,它会一直拯救你.在这一点上,你将拥有一个基本上是一个回购,其中只有v3.0以上的修订历史从linux-stable.git repo开始.就像使用--depth
on clone一样,你对repo有相同的限制,只能修改和发送你已经拥有的历史记录中的补丁.有办法解决这个问题......但它应该有自己的问答.
我自己正在测试最后几个步骤,但git filter-branch
操作仍在进行中.我会更新这篇文章有任何问题,但我会继续并发布它,这样你就可以开始这个过程,如果你觉得它可以接受.
UPDATE
问题的解决方法(致命:不允许空身份<>).此问题源于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 '
Run Code Online (Sandbox Code Playgroud)
对于已经拥有克隆的人,此命令将获取当前分支的提示和标记之间的提交数量v5.2
:
$ git rev-list HEAD ^v5.2 --count
407
Run Code Online (Sandbox Code Playgroud)
我发现这个项目使用 GitHub API 实现 rev-list: https://github.com/cjlarose/github-rev-list
rev-list上非常长的手册页表明幕后发生了很多事情。有许多不同的路径可以通过分支和合并来计算提交。对于这个用例,虽然这可能可以被忽略(?)
不幸的是,--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
Run Code Online (Sandbox Code Playgroud)
归档时间: |
|
查看次数: |
15219 次 |
最近记录: |