現在時刻 - 2017年11月20日(月) 01:16


違うレポジトリから一気に自分のレポジトリへmergeする際のテクニック

XXXの使い方など、端末に限らない話題はこちらへどうぞ。
  • 作成者
  • メッセージ

HomuHomu

  • 記事: 211
  • 登録日時: 2013年5月30日(木) 21:31

違うレポジトリから一気に自分のレポジトリへmergeする際のテクニック

投稿記事2013年5月30日(木) 21:51

HTCでもSamsungでも同様のテクニックが使えると思うのでここにチラ裏で書きます。
違うレポジトリからgit format-patchでpatchを作りgit amで適用するのが通例かと思いますが。
正直「めっちゃめんどくさす」(O型なので)

そういう時はfetchして来てmergeしてgrepで衝突部分を直して、一気にgit commit -a

たとえばKBCのSC06Dカーネルhttps://github.com/kbc-developers/android_kernel_samsung_d2dcm
CMコミットから大量にmergeする場合
こんな感じで自分はやってます。
git fetch git://github.com/CyanogenMod/android_ke ... ung_d2.git cm-10.1:cm-10.1
git merge cm-10.1
これでコンフリクトが起きなければそのままコミットまで行きますが、同期が取れていない最初のうちはコンフリクトがかなり発生するでしょう。
そこでコンフリクトしている箇所を探します。
grep -lr 'cm-10.1' * >conflict.txt
これで コンフリクト起こしているファイルが一覧として表示されるので
gedit (コンフリクトファイル)
で衝突部分をサーチします。
merge元を選択するか、merge先を選択するかはコードを読んで決めてください。(同等のデバイスでレポがCMソースならCMソースが優先でいいんじゃねぇかな?)
で、コンフリクトが解決したらgit commit -aでコミットし、makeしてコンパイルエラーが出ないか、ブートするかを確認し
エラーが出るようであれば、fix(単純なコンパイルエラーなら、ある程度こなせば脊髄反射で直せるようになると思います。)してコミット
そいで、プッシュてな感じですかね。もう一つの手法は次に書きます。

HomuHomu

  • 記事: 211
  • 登録日時: 2013年5月30日(木) 21:31

Re: 違うレポジトリから一気に自分のレポジトリへmergeする際のテクニック

投稿記事2013年5月30日(木) 22:10

もう一つのやりかたとして、デバイスは近いんだけど全部mergeしたくないんだよねぇぇぇ
一部だけ欲しいんだよねぇぇぇという場合もあるかと思いますので
そういう時は欲しいコミットがあるレポをfetchで持ってきます。
例えば、SC03Dの場合、プロプレなmpdecisionを使用するとSoDが頻繁に発生してやべぇぇぇということになってFuckなことになってましたので
※最近は安定してます。
kernelベースのHotPlugDriverねーかなーと探してみたら。
https://github.com/showp1984/bricked-py ... decision.c
あったりするんですよねー
でもこれはSamsungではなくHTCでmsmだけどもシングルチップじゃんと悩むことになります(よね?)
でも自分はO型なので
あまりな悩まずに自分のレポへFetchしちゃう
git fetch git://github.com/showp1984/bricked-pyramid-3.0.git -b exp:mpdecision
ってな感じで
でもこれをいきなりmergeするととーーーぜん大変なことになるので
どうするかというと
git log --oneline arch/arm/mach-msm/msm_mpdecision.c >mpdecision.txtで
でこいつのコミット履歴を全部抜き出します。
んで、git cherry-pick コミットID
で最初からポチポチやっていくという作戦
んで全部かっぱらってきたら、バイバイってな感じで
git branch -D mpdecision
して完了って感じでやってます。(超お手軽)

伝わりますか?伝わります、、、よね??

HomuHomu

  • 記事: 211
  • 登録日時: 2013年5月30日(木) 21:31

Re: 違うレポジトリから一気に自分のレポジトリへmergeする際のテクニック

投稿記事2013年5月30日(木) 22:32

最後はKernelバージョンアップもfetch&Mergeってしまおう作戦
masterコミットは純正ソースでいいかと思いますが
それとはまた別にkernel.orgからfetchで別ブランチへ落としてきます。
git fetch git://git.kernel.org/pub/scm/linux/kern ... nux-stable linux-3.0.y:linux-3.0.y
3.4.x系の場合は
git fetch git://git.kernel.org/pub/scm/linux/kern ... nux-stable linux-3.4.y:linux-3.4.y
ってな感じですね。
ただ、大体はkernel.orgの方が当然バージョンが高いため
そのままgit merge linux-3.0.yとかすると大変なことになってしまうんですよね。
なのでkernel.orgにあるtagを利用し、同kernelversionと合わせたブランチを作ります。
自分のカーネルバージョンが3.0.8ならば
git checkout -b linux-3.0.8 refs/tags/v3.0.8
(だったかな?)
でlinux-3.0.8のkernel.orgのブランチが出来上がりますんで
そのままmerge、、、、
、、、してはいけませんね。これでも大量にコンフリクトすることでしょう。
(ベンダー側が大幅にカスタマイズしているため)
なので、このブランチソース(linux-3.0.8)に純正ソースをそのまま上書きしてしまいます。
カーネルバージョンが合っているからいいんでないかい?(自分O型だし)
で、ここでmerge linux-3.0.y
これでも結構コンフリクっちゃったりするのが腹立たしい所
でもそういう時は純正ソースを全部優先しちゃいます。(だってベンダーがカスタマイズしたものだし)
全部優先する場合には
git checkout --ours .
って感じですね。
ようはauto mergeできなかったファイルは全部自分のファイル使うよって命令です。
ここで git commi -a
これでlkernel.orgのコミットが全て入ったことになり、見た目も綺麗です(そうか?)
でも、動かない場合もありますので、その場合は適時、修正してください(笑)

caplioz

管理人

  • 記事: 64
  • 登録日時: 2013年5月25日(土) 11:12

Re: 違うレポジトリから一気に自分のレポジトリへmergeする際のテクニック

投稿記事2013年5月30日(木) 22:40

>伝わりますか?伝わります、、、よね??

物凄く伝わってます!なるほど一々remote add で増やしてないで、
fetchで毎回ブランチ切って、cherry-pickでも良いんですね。

カーネルのバージョン当てる時とかは、
$ git remote add kernel git://git.kernel.org/pub/scm/linux/kern ... stable.git
$ git fetch kernel

ってやった後に、tagのlogから差分取って

$ git log -s v3.4.5 --oneline |head -1
$ git log -s v3.4.6 --oneline |head -1

結果をformat-patchでファイルに落としたものとgit amで適用してました。
物凄く非効率な気がするので、もっと良いやり方ありそうですね・・・

caplioz

管理人

  • 記事: 64
  • 登録日時: 2013年5月25日(土) 11:12

Re: 違うレポジトリから一気に自分のレポジトリへmergeする際のテクニック

投稿記事2013年5月30日(木) 22:42

って書いてる隙からw
ちょっと全部merge良いですね。手元のMasterからやってみます!

caplioz

管理人

  • 記事: 64
  • 登録日時: 2013年5月25日(土) 11:12

Re: 違うレポジトリから一気に自分のレポジトリへmergeする際のテクニック

投稿記事2013年5月30日(木) 23:23

HomuHomu さんが書きました:最後はKernelバージョンアップもfetch&Mergeってしまおう作戦
masterコミットは純正ソースでいいかと思いますが



これ試してみました。

$ git checkout -b linux-3.4.10 refs/tags/v3.4.10

ここでHTCdevのSourceをコピーして、一旦commit。

その後、linux-3.4.y:linux-3.4.yでfetchしたbranchを、
$ git merge linux-3.4.y
$ git checkout --ours .
$ git commi -a

山ほどConflictがあったみたいだけど、気にせず $ make しましたが、
init/main.c やらいろんな所でBuildがコケる状態になりました・・。
(何個まで諦めずに修正>ビルドを試すべきか・・・)

HomuHomu

  • 記事: 211
  • 登録日時: 2013年5月30日(木) 21:31

Re: 違うレポジトリから一気に自分のレポジトリへmergeする際のテクニック

投稿記事2013年5月30日(木) 23:26

んーと
v3,4,10にdevソースを上書きした状態で一度makeしてみましょう。
動きますか?

HomuHomu

  • 記事: 211
  • 登録日時: 2013年5月30日(木) 21:31

Re: 違うレポジトリから一気に自分のレポジトリへmergeする際のテクニック

投稿記事2013年5月30日(木) 23:39

あと別にkernel.orgにこだわる必要もないです。
同デバイスでfetch mergeしてカーネルバージョン上げてるレポがあるなら
それを使用してもいいし。
↓こいつを使用してもいいかと。
https://github.com/android/kernel_commo ... ndroid-3.4
あとは、コンパイルエラーが出ても「ふふん :lol: 」とfixするくらいMな精神でいけばOK!

なに書いてるんだオレw

caplioz

管理人

  • 記事: 64
  • 登録日時: 2013年5月25日(土) 11:12

Re: 違うレポジトリから一気に自分のレポジトリへmergeする際のテクニック

投稿記事2013年5月30日(木) 23:49

HomuHomu さんが書きました:んーと
v3,4,10にdevソースを上書きした状態で一度makeしてみましょう。
動きますか?


3.4.10に上書きだと動きますね。0.5ずつとか当てられると楽そうですが・・

>コンパイルエラーが出ても「ふふん :lol: 」とfixするくらいMな精神でいけばOK!

やっぱりこれですかねw

caplioz

管理人

  • 記事: 64
  • 登録日時: 2013年5月25日(土) 11:12

Re: 違うレポジトリから一気に自分のレポジトリへmergeする際のテクニック

投稿記事2013年5月31日(金) 00:42

git checkout -b linux-3.4.11 refs/tags/v3.4.11でtag毎にブランチ作って、
それをmergeするのが凄い楽ですね。Conflictをどこまで無視して良いか微妙ですが、
これで暫く当ててみます・・・。
次へ

Return to 技術系雑談など