3

Linux カーネルの修正バージョン用の未加工のオープンソース コードがいくつかあります。理想的には、新しいバージョンのカーネルに適用できるようにパッチを用意する必要がありますが、代わりにソース コードしかないので、そのパッチを自分で作成しようとしています。

私が見つけたのは、パッチを作成して新しいカーネルに適用すると、多くの変更が元に戻ってしまうということです。ローカルの変更が以前のコミットを元に戻しているかどうかを確認できる git の機能はありますか? または、最小限の変更でコミットを見つけることができる他のツールがありますか (時間がかかり、自分のマシンで実行する必要がある場合でも)?

ソースの分岐元のコミットを手動で絞り込んでいますが、非常に時間がかかります。かなり厳密に一致するブランチを見つけたので、変更が加えられる前の最新のコミットが何であったかを把握しようとしています。

コミット A をチェックアウトし、変更されたファイルをコピーし、多くのものを取り出したファイルにログを記録して、コミット B から正確な変更が追加されたかどうかを確認し、コミット B の前にコミットをチェックアウトします。など...

編集: これはすべてオープン ソース コードに関するものであるため、ここでリンクを共有できない理由はありません。

LGE によってリリースされたソース コードは、ここにあります。モバイルで LS970 を検索します。

MSM カーネルのさまざまなブランチは、ここにあります。これまでのところ、ics_strawberry頭が最も近いようです。これはフォルダを持つ数少ないものの 1 つであり、chromeosChrome OS を実行していない携帯電話用に特別に追加するのは奇妙なことのようです.

4

2 に答える 2

3

残念ながら、git bisectどのコミットでもそれが悪いか良いかを判断できないため、ここでは使用できません。

目標は、ターゲット ソースに最適なコミットを見つけることです。「最適なマッチング」の最良の指標は、統合された差分/パッチのサイズ (行数) だと思います。

これを念頭に置いて、次の疑似コードに従ってスクリプトを作成できます (シェル、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 に答える