阅读完整的解决方案,但不幸的是,git clone不能按您要求的方式工作。参数
--depth
限制了
revisions
的数量,而不是
commits
的数量。没有一个克隆参数可以限制提交量。在您的情况下,即使您知道在v3.0和repo中最新的HEAD之间,文件中至多只有10个修订差异,并使用
--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.0的sha
git log --oneline v3.0^..v3.0
- 创建以此sha为起点的嫁接点(它是02f8c6aee8df3cdc935e9bdd4f2d020306035dbe)
-
echo "02f8c6aee8df3cdc935e9bdd4f2d020306035dbe" > .git/info/grafts
- 为了解决一些内核日志条目的问题,请执行以下操作:
export GIT_AUTHOR_NAME="tmp"
和
export GIT_COMMITTER_NAME="tmp"
- 有一个关于
git filter-branch
在跟随嫁接点重写历史的man页面上的良好警告...所以让我们滥用它,现在运行
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版本及以后的内容的存储库。就像在克隆时使用
--depth
一样,您的存储库也有相同的限制,并且只能从您已经拥有的历史记录中进行修改和发送补丁。虽然有一些方法可以解决这个问题,但这需要单独进行问答。
我正在测试最后几步,但是
git filter-branch
操作仍在进行中。如果出现任何问题,我将更新此帖子,但我将继续发布它,以便您如果认为可接受可以开始这个过程。
更新
解决问题(致命错误:空标识符<>不允许)。这个问题源于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 '