日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 编程资源 > 编程问答 >内容正文

编程问答

合并Spark社区代码的正确姿势

發布時間:2023/12/6 编程问答 38 豆豆
生活随笔 收集整理的這篇文章主要介紹了 合并Spark社区代码的正确姿势 小編覺得挺不錯的,現在分享給大家,幫大家做個參考.

原創文章,轉載請保留出處

最近剛剛忙完Spark 2.2.0的性能測試及Bug修復,社區又要發布2.1.2了,國慶期間剛好有空,過了一遍2.1.2的相關JIRA,發現有不少重要修復2.2.0也能用上,接下來需要將有用的PR合到我們內部維護的2.2.0分支上了。

經常有朋友問我是怎么把社區的PR合到自己分支上的,我之前跟他們介紹的做法是基于PR拉分支,在IDEA中單個文件diff合并。如果是偶爾合下社區代碼,這種方式也不算太費事。但是如果PR中改動的文件較多,或者要合并多個PR過來,這種方式也挺麻煩。

廢話到此,這篇文章是介紹,如何高效地合并Spark社區PR到自己維護的分支(常說的打Patch),當然,針對其他開源項目,該方法同樣適用。

PR:Pull Request是GitHub上的一個功能,開源代碼的貢獻者,通過發起一個Pull Request向社區貢獻代碼。

準備Spark代碼

一般來說,自己維護一套Spark代碼,需要Fork下社區項目,在clone自己Fork的代碼,進行開發。我這里以Spark 2.2.0為例。

  • clone自己Fork的倉庫到本地

    # stanzhai是我的GitHub賬號,大家需要換成自己的倉庫地址 git clone https://github.com/stanzhai/spark.git cd spark
  • 添加一個名為upstream的遠程倉庫指向社區的版本庫

    git remote add upstream https://github.com/apache/spark.git
  • 設置PR引用,編輯git配置vi .git/config,找到upstream,添加最后一行fetch

    [remote "upstream"]url = https://github.com/apache/spark.gitfetch = +refs/heads/*:refs/remotes/upstream/*fetch = +refs/pull/*/head:refs/remotes/upstream/pr/* # 注意添加這行
  • 同步遠端庫,更新分支引用(每次合并前都需要執行)

    git remote update
  • checkout一個2.2.0的維護分支

    git checkout -b my-2.2.0 v2.2.0
  • 我們創建了一個基于2.2.0的my-2.2.0分支,下面的示例是將社區PR合并到my-2.2.0分支中。

    提交給社區的PR大致分為2類:

  • PR被接受,且被合并到社區的倉庫
  • PR沒有合并到社區倉庫,(代碼沒問題,有可能commiter還沒來得及處理)
  • 整合已被社區合并的PR

    被合并到社區的PR已經做了rebase處理,對于這種PR,合并到自己的分支中是非常簡單的事情,直接使用git的cherry-pick就可以搞定。

    我們以這個卡片為例:https://issues.apache.org/jira/browse/SPARK-22083

    這個卡片被標記為resolved,而且PR也被合到社區倉庫了:https://github.com/apache/spark/pull/19311,我們打開這個鏈接,到頁面下方,找到這個位置:

    打開后,會跳轉到這個地址:https://github.com/apache/spark/commit/2c5b9b1173c23f6ca8890817a9a35dc7557b0776,地址中后面的一長串就是我們需要的commit-id,得到這個就可以直接合并代碼了:

    git remote update git cherry-pick 2c5b9b1173c23f6ca8890817a9a35dc7557b0776

    執行完,提示以下信息就表示合并成功了:

    ? spark git:(my-2.2.0) ? git cherry-pick 2c5b9b1173c23f6ca8890817a9a35dc7557b0776 [my-2.2.0 529f5ea55ff] [SPARK-22083][CORE] Release locks in MemoryStore.evictBlocksToFreeSpaceAuthor: Imran Rashid <irashid@cloudera.com>Date: Mon Sep 25 12:02:30 2017 -07002 files changed, 153 insertions(+), 13 deletions(-)

    如果合并的代碼恰好也被你改過了,那么有可能會出現沖突,這種情況正常解決沖突,然后git commit就可以了。

    整合尚未合并到社區的PR

    由于一個PR可能包含多次提交,整合未合并到社區的PR就比較麻煩了。Spark的主干代碼每天都有變動,直接對比兩個不同的分支變動通常會比較大,我們需要將PR中n次提交的代碼的所有變更梳理出來,然后在做整合。

    我們以這個PR為例:https://github.com/apache/spark/pull/19301,這個PR實現上還有待改進,但可以正常工作,因此還沒合入社區,我們將這個PR合并到my-2.2.0分支,需要進行以下操作:

    # 更新遠程倉庫及版本引用信息 git remote update# 基于某個PR創建一個分支,這里的19301是這個PR在GitHub上的id git checkout -b pr-19301 upstream/pr/19301 git checkout pr-19301# PR分支大都基于master開發,以upstream/master分支為基準,重新apply PR分支上的修改 git rebase upstream/master# 通過diff提取這次PR的patch文件 git diff upstream/master > pr-19301.patch# 到目標分支打patch git checkout my-2.2.0 git apply --reject pr-19301.patch# 查看上一步apply的狀態 git status # apply有可能會不成功,尚未apply的patch被存放到*.rej文件中,需要手動處理,最后提交即可 git commit -a# 清理 rm pr-19301.patch rm *.rej git branch -D pr-19301

    參考

    • Useful Developer Tools
    • A successful Git branching model
    • Git 分支 - 分支的衍合

    最后

    上述方法不能保證合PR 100%成功,原則上你的分支和社區代碼約近,沖突越少,越容易處理。Spark 2.x的代碼有很大的變動,把針對2.x的PR打到1.6的分支上,往往是個麻煩事。

    文章首發自知乎專欄:Spark大數據技術,專注大數據、Spark相關技術,歡迎關注。

    據說看完這篇文章給個贊的同學,打Patch都不會遇到沖突 ~(≧▽≦)/~

    總結

    以上是生活随笔為你收集整理的合并Spark社区代码的正确姿势的全部內容,希望文章能夠幫你解決所遇到的問題。

    如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。