自拍偷在线精品自拍偷,亚洲欧美中文日韩v在线观看不卡

合并Spark社區(qū)代碼的正確姿勢(shì)

大數(shù)據(jù) Spark
最近剛剛忙完Spark 2.2.0的性能測(cè)試及Bug修復(fù),社區(qū)又要發(fā)布2.1.2了,國(guó)慶期間剛好有空,過(guò)了一遍2.1.2的相關(guān)JIRA,發(fā)現(xiàn)有不少重要修復(fù)2.2.0也能用上,接下來(lái)需要將有用的PR合到我們內(nèi)部維護(hù)的2.2.0分支上了。

最近剛剛忙完Spark 2.2.0的性能測(cè)試及Bug修復(fù),社區(qū)又要發(fā)布2.1.2了,國(guó)慶期間剛好有空,過(guò)了一遍2.1.2的相關(guān)JIRA,發(fā)現(xiàn)有不少重要修復(fù)2.2.0也能用上,接下來(lái)需要將有用的PR合到我們內(nèi)部維護(hù)的2.2.0分支上了。

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

[[206086]]

廢話到此,這篇文章是介紹,如何高效地合并Spark社區(qū)PR到自己維護(hù)的分支(常說(shuō)的打Patch),當(dāng)然,針對(duì)其他開(kāi)源項(xiàng)目,該方法同樣適用。

PR:Pull Request是GitHub上的一個(gè)功能,開(kāi)源代碼的貢獻(xiàn)者,通過(guò)發(fā)起一個(gè)Pull Request向社區(qū)貢獻(xiàn)代碼。

準(zhǔn)備Spark代碼

一般來(lái)說(shuō),自己維護(hù)一套Spark代碼,需要Fork下社區(qū)項(xiàng)目,在clone自己Fork的代碼,進(jìn)行開(kāi)發(fā)。我這里以Spark 2.2.0為例。

1、 clone自己Fork的倉(cāng)庫(kù)到本地

 

  1. # stanzhai是我的GitHub賬號(hào),大家需要換成自己的倉(cāng)庫(kù)地址  
  2. git clone https://github.com/stanzhai/spark.git  
  3. cd spark 

2、 添加一個(gè)名為upstream的遠(yuǎn)程倉(cāng)庫(kù)指向社區(qū)的版本庫(kù)

  1. git remote add upstream https://github.com/apache/spark.git 

3、 設(shè)置PR引用,編輯git配置vi .git/config,找到upstream,添加最后一行fetch

 

  1. [remote "upstream" 
  2. url = https://github.com/apache/spark.git  
  3. fetch = +refs/heads/*:refs/remotes/upstream/*  
  4. fetch = +refs/pull/*/head:refs/remotes/upstream/pr/* # 注意添加這行 

4、 同步遠(yuǎn)端庫(kù),更新分支引用(每次合并前都需要執(zhí)行)

  1. git remote update 

5、 checkout一個(gè)2.2.0的維護(hù)分支

  1. git checkout -b my-2.2.0 v2.2.0 

我們創(chuàng)建了一個(gè)基于2.2.0的my-2.2.0分支,下面的示例是將社區(qū)PR合并到my-2.2.0分支中。

提交給社區(qū)的PR大致分為2類:

  • PR被接受,且被合并到社區(qū)的倉(cāng)庫(kù)
  • PR沒(méi)有合并到社區(qū)倉(cāng)庫(kù),(代碼沒(méi)問(wèn)題,有可能commiter還沒(méi)來(lái)得及處理)

整合已被社區(qū)合并的PR

被合并到社區(qū)的PR已經(jīng)做了rebase處理,對(duì)于這種PR,合并到自己的分支中是非常簡(jiǎn)單的事情,直接使用git的cherry-pick就可以搞定。

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

這個(gè)卡片被標(biāo)記為resolved,而且PR也被合到社區(qū)倉(cāng)庫(kù)了:https://github.com/apache/spark/pull/19311,我們打開(kāi)這個(gè)鏈接,到頁(yè)面下方,找到這個(gè)位置:

 

[[206087]]

打開(kāi)后,會(huì)跳轉(zhuǎn)到這個(gè)地址:https://github.com/apache/spark/commit/2c5b9b1173c23f6ca8890817a9a35dc7557b0776,地址中后面的一長(zhǎng)串就是我們需要的commit-id,得到這個(gè)就可以直接合并代碼了:

 

  1. git remote update  
  2. git cherry-pick 2c5b9b1173c23f6ca8890817a9a35dc7557b0776 

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

 

  1. ➜ spark git:(my-2.2.0) ✗ git cherry-pick 2c5b9b1173c23f6ca8890817a9a35dc7557b0776 
  2. [my-2.2.0 529f5ea55ff] [SPARK-22083][CORE] Release locks in MemoryStore.evictBlocksToFreeSpace 
  3. Author: Imran Rashid 
  4. Date: Mon Sep 25 12:02:30 2017 -0700 
  5. 2 files changed, 153 insertions(+), 13 deletions(-) 

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

整合尚未合并到社區(qū)的PR

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

我們以這個(gè)PR為例:https://github.com/apache/spark/pull/19301,這個(gè)PR實(shí)現(xiàn)上還有待改進(jìn),但可以正常工作,因此還沒(méi)合入社區(qū),我們將這個(gè)PR合并到my-2.2.0分支,需要進(jìn)行以下操作:

 

  1. # 更新遠(yuǎn)程倉(cāng)庫(kù)及版本引用信息 
  2. git remote update 
  3.  
  4. # 基于某個(gè)PR創(chuàng)建一個(gè)分支,這里的19301是這個(gè)PR在GitHub上的id 
  5. git checkout -b pr-19301 upstream/pr/19301 
  6. git checkout pr-19301 
  7.  
  8. # PR分支大都基于master開(kāi)發(fā),以u(píng)pstream/master分支為基準(zhǔn),重新apply PR分支上的修改 
  9. git rebase upstream/master 
  10.  
  11. # 通過(guò)diff提取這次PR的patch文件 
  12. git diff upstream/master > pr-19301.patch 
  13.  
  14. # 到目標(biāo)分支打patch 
  15. git checkout my-2.2.0 
  16. git apply --reject pr-19301.patch 
  17.  
  18. # 查看上一步apply的狀態(tài) 
  19. git status 
  20.  
  21. # apply有可能會(huì)不成功,尚未apply的patch被存放到*.rej文件中,需要手動(dòng)處理,最后提交即可 
  22. git commit -a 
  23.  
  24. # 清理 
  25. rm pr-19301.patch 
  26. rm *.rej 
  27. git branch -D pr-19301 

參考

Useful Developer Tools

A successful Git branching model

Git 分支 - 分支的衍合

最后

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

責(zé)任編輯:未麗燕 來(lái)源: 知乎
相關(guān)推薦

2017-02-23 15:37:44

OptionObject容器

2016-05-09 10:41:03

算法分析開(kāi)發(fā)

2018-01-11 15:31:39

命令Linux關(guān)機(jī)

2017-07-10 13:09:45

前端Flexbox

2017-03-16 11:39:33

Openstack源碼姿勢(shì)

2023-01-30 07:41:43

2016-12-12 08:48:24

2019-12-27 15:58:57

大數(shù)據(jù)IT互聯(lián)網(wǎng)

2024-09-25 08:22:06

2021-09-15 16:20:02

Spring BootFilterJava

2021-01-08 08:10:34

MySQL表空間回收

2017-12-12 16:43:54

SparkHadoop水平

2020-09-04 15:38:19

Web前端開(kāi)發(fā)項(xiàng)目

2022-02-21 11:21:40

golang編程語(yǔ)言

2015-07-13 11:32:09

PHP程序員正確姿勢(shì)

2019-11-26 09:36:02

互聯(lián)網(wǎng)數(shù)據(jù)技術(shù)

2021-04-02 12:37:53

RestfulAPI接口架構(gòu)

2023-01-06 08:24:00

PandasPython

2018-06-13 10:27:04

服務(wù)器性能優(yōu)化

2019-10-30 17:06:50

AWS物聯(lián)網(wǎng)IoT
點(diǎn)贊
收藏

51CTO技術(shù)棧公眾號(hào)