Android 查找git提交某些代码的来源

Android 查找git提交某些代码的来源,android,git,linux-kernel,Android,Git,Linux Kernel,我有一些原始的linux内核修改版本的开源代码。理想情况下,我会有一个补丁,这样我就可以将它应用到一个更新版本的内核上,但是我只有源代码,所以我正在尝试自己创建这个补丁 我发现,当我创建一个补丁并将其应用于较新的内核时,我最终恢复了很多更改。git中是否有一个功能可以判断本地更改是否正在恢复以前的提交?或者是否有其他工具可以找到更改最少的提交(即使它非常耗时并且必须在我自己的机器上运行) 我一直在手动缩小提交源分支的范围,但这非常耗时。我发现了一个非常匹配的分支,现在我正在尝试在对其进行更改之前

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

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

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

我将签出提交a,复制更改的文件,对任何有大量内容的文件进行日志记录,以确定这些确切的更改是否是从提交B添加的,然后在提交B之前签出提交,等等

编辑:因为这都是关于开源代码的,所以我不明白为什么我不能在这里共享到它的链接

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


可以找到MSM内核的不同分支。到目前为止,
ics\u
头似乎是最接近的。这是为数不多的几个有
chromeos
文件夹的手机之一,专门为不运行chromeos的手机添加这个文件夹似乎是件很奇怪的事情。

你可以使用
git-bull
来找出每行代码是在哪个提交中引入的。比如说,

git blame main.c

查看可用于微调
责怪的输出和其他很酷的技巧的各种选项。

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

您的目标是找到与目标源最匹配的提交。我认为“匹配最佳”的最佳度量是统一的diff/patch的大小(以行为单位)

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

min_diff_size=1000000000
最佳提交=无
git branch tmp原始分支#要扫描的分支
git签出tmp
对于(;;){
diff_size=`diff-burN-x.git my_git_子树my_src_子树wc-l`;
if(差异大小<最小差异大小){
最小差异大小=差异大小;
best_commit=`git log--oneline-1`;
}
git reset--硬头~#按1次提交倒回
如果(git复位不起作用)中断;
}
git签出原始分支
吉特分行-d tmp
打印“最佳提交$最佳提交,差异大小$最小差异大小”
您可能还希望循环遍历内核分支,以找到最佳匹配的分支


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

问题是我的代码不受源代码管理。它显然是从git分支出来的,但我没有git元数据;仅发布代码的快照。您最好的选择可能是克隆源代码的repo。你甚至可以将后来提交的补丁应用到它上面,并对git进行适当的指责。这就是拼图中缺失的部分。我不知道代码来自哪个回购协议。我发现了一个似乎非常接近的回购协议(它的相关分支也非常相似),所以现在我假设这是正确的回购协议。现在的诀窍是找到该repo的哪个提交最接近我给出的代码。它为您提供了一种在
log(n)
commits中手动查找所需内容的方法。我想通过进行二进制搜索可以大大加快速度。定义一个范围并从中间开始。现在,将度量值设置为1/4和3/4,并根据度量值较低的位置在[0;1/2]或[1/2;1]上重复该过程。最后,我结合使用mvp的伪代码和Chronial的建议编写了一个Perl脚本,其运行速度出乎意料地快于我的想象。我已经将代码发布在了git diff search上,非常棒!感谢您将这个想法转化为有用的东西!这就是开源的工作原理!:)我今天刚刚使用了
git-bisect
,并且意识到
git-bisect-run
可以与这个脚本的更简单版本一起使用(可能使用环境变量来跟踪最小差异大小)。在下次使用它之前,我可能会对其进行调整。
git bisect
帮助您找出在分支中两次提交之间的某个地方发生的变化。换句话说,对于任何提交,只有当您可以说这是坏的提交,或者这仍然是好的提交时,它才能工作。对于我们的问题,你不能在任何时候说它到底是好是坏——这两者都不是。只有当你们达到绝对最小值时,它才是好的,但直到你们到达那个里你们才会知道它。
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"