3

我有一些用于修改版本的 linux 内核的原始开源代码。理想情况下,我会有一个补丁,这样我就可以将它应用到更新版本的内核中,但我只有源代码,所以我正在尝试自己创建那个补丁。

我发现当我创建一个补丁并将其应用到较新的内核时,我最终会恢复很多更改。git 中是否有一个功能可以判断本地更改是否正在恢复以前的提交?或者是否有其他工具可以找到更改最少的提交(即使它很耗时并且必须在我自己的机器上运行)?

我一直在手动缩小源分支的提交范围,但这非常耗时。我找到了一个非常匹配的分支,现在我试图弄清楚在对其进行更改之前最新的提交是什么。

我将检查提交 A,复制更改的文件,对任何包含大量内容的文件进行日志记录,以确定是否从提交 B 添加了这些确切的更改,然后在提交 B 之前检查提交等, ETC...

编辑:由于这都与开源代码有关,我看不出有什么理由不能在这里分享它的链接。

LGE 发布的源代码可以在这里找到。在 Mobile 下搜索 LS970。

MSM 内核的不同分支可以在这里找到。到目前为止,ics_strawberry头部似乎是最接近的。它是少数几个有chromeos文件夹的公司之一,如果专门为不运行 Chrome OS 的手机添加似乎是一件奇怪的事情。

4

2 回答 2

3

不幸的是,您不能git bisect在此处使用,因为您无法在任何提交时判断它是好是坏。

您的目标是找到与您的目标源最匹配的提交。我认为“匹配最佳”的最佳指标是统一差异/补丁的大小(以行为单位)。

考虑到这一点,您可以根据以下伪代码编写脚本(对不起,shell、Perl 和 C 的奇怪组合):

min_diff_size = 10000000000
best_commit = none
git branch tmp original_branch  # branch to scan
git checkout tmp
for (;;) {
    diff_size = `diff -burN -x.git my_git_subtree my_src_subtree | wc -l`;
    if (diff_size < min_diff_size) {
         min_diff_size = diff_size;
         best_commit = `git log --oneline -1`;
    }
    git reset --hard HEAD~; # rewind back by 1 commit
    if (git reset did not work) break;
}
git checkout original_branch
git branch -d tmp

print "best commit $best_commit, diff size $min_diff_size"

您可能还想循环浏览内核分支以找到最佳匹配分支。

这可能会运行缓慢并且需要很多时间(可能是几个小时),但它会找到最匹配的提交。

于 2012-12-16T09:55:58.407 回答
-2

您可以使用git blame来找出每行代码引入的提交。例如,

git blame main.c

查看手册页,了解可用于微调blame输出和其他很酷技巧的各种选项。

于 2012-12-16T05:10:12.050 回答