合并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為例。

  1. clone自己Fork的倉庫到本地

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

    git remote add upstream https://github.com/apache/spark.git
  3. 設置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/*  # 注意添加這行
  4. 同步遠端庫,更新分支引用(每次合并前都需要執行)

    git remote update
  5. 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類:

  1. PR被接受,且被合并到社區的倉庫
  2. 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,我們打開這個鏈接,到頁面下方,找到這個位置:

spark-pr.png

打開后,會跳轉到這個地址: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都不會遇到沖突 ~(≧▽≦)/~

本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。
如若轉載,請注明出處:http://www.pswp.cn/news/287559.shtml
繁體地址,請注明出處:http://hk.pswp.cn/news/287559.shtml
英文地址,請注明出處:http://en.pswp.cn/news/287559.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

.NET 中 GC 的模式與風格

垃圾回收&#xff08;GC&#xff09;是托管語言必備的技術之一。GC 的性能是影響托管語言性能的關鍵。我們的 .NET 既能寫桌面程序 (WINFROM , WPF) 又能寫 web 程序 (ASP.NET CORE)&#xff0c;甚至還能寫移動端程序。。。不同使用場景的程序對 GC 的風格也有不同的要求&#…

(轉)java中的 | ^ 分別是什么?

|是按位或 ^是按位抑或 &是按位與比如有兩個數 int x 5;int y 11;System.out.println(x|y);System.out.println(x&y);System.out.println(x^y);結果是15&#xff0c; 1 &#xff0c;14 過程 x5 (0101二進制) y11(1011二進制) x|y 1111 15 x&y 0001 1 x…

[python opencv 計算機視覺零基礎到實戰] 七、邏輯運算與應用

一、學習目標 了解opencv中圖像的邏輯運算了解opencv中邏輯運算的應用 目錄 [python opencv 計算機視覺零基礎到實戰] 一、opencv的helloworld [【python opencv 計算機視覺零基礎到實戰】二、 opencv文件格式與攝像頭讀取] 一、opencv的helloworld [[python opencv 計算機…

Android之如何判斷當前是阿拉伯布局的方法

1 問題 判斷當前是不是阿拉伯布局的方法 2 幾種判斷方法 @SuppressLint("NewApi")public static boolean isLayoutRtl(View view, Resources res) {if (res == null || view == null) return false;Locale curLocale = res.getConfiguration().locale;//如果當前語言…

【ArcGIS風暴】數字化實驗:數據采集與編輯完整操作流程

一.實驗平臺:ArcGIS 9.3 二.實驗目的:對甘肅省的十四個地級市進行圖像配準、數據采集。 三.實驗要求:掌握地理數據采集方法,圖像配準及坐標投影,選擇主要的點、線、面進行投影。 四.實驗數據:甘肅省統計數據,甘肅省行政區劃圖。 (一).影像配準 第一步:加載…

loadrunner java 參數化_LoadRunner 參數化詳解

LoadRunner&#xff0c;是一種預測系統行為和性能的負載測試工具。通過以模擬上千萬用戶實施并發負載及實時性能監測的方式來確認和查找問題&#xff0c;LoadRunner能夠對整個企業架構進行測試。通過使用 LoadRunner&#xff0c;企業能最大限度地縮短測試時間&#xff0c;優化性…

Android之實現RTL的ViewPager

1 問題 如何實現RTL的ViewPager,就是滑動方向和我們之前滑動的方向相反,比如一般,我們用ViewPager滑動4個圖片,依次順序是 1 2 3 4 ,我們在頁面1的時候,我們一般都是習慣向左滑動到2,現在需要實現手指向右滑動到2. 2 解決辦法 1)我們可以使用ViewPager2,這個是可以支…

Why Apache Spark is a Crossover Hit for Data Scientists [FWD]

Spark is a compelling multi-purpose platform for use cases that span investigative, as well as operational, analytics. Data science is a broad church. I am a data scientist — or so I’ve been told — but what I do is actually quite different from what oth…

Blazor University (21)使用 RenderFragments 模板化組件 —— 傳遞占位符

原文鏈接&#xff1a;https://blazor-university.com/templating-components-with-renderfragements/passing-placeholders-to-renderfragments/將占位符傳遞給 RenderFragments源代碼[1]說明&#xff1a;此頁面的靈感來自用戶 ?ister?agoo 的 Twitter 帖子。首先&#xff0c…

物聯網(車聯網)平臺架構方案

技術支持QQ&#xff1a;787728951、車載終端網關采用mina/nettyspring架構&#xff0c;獨立于其他應用&#xff0c;主要負責維護接入終端的tcp鏈接、上行以及下行消息的解碼、編碼、流量控制&#xff0c;黑白名單等安全控制&#xff0c;網關同時支持交通部JT/T808-2011、JT/T80…

[python opencv 計算機視覺零基礎到實戰] 八、ROI泛洪填充

一、學習目標 了解什么是ROI了解floodFill的使用方法 如有錯誤歡迎指出~ 目錄 [python opencv 計算機視覺零基礎到實戰] 一、opencv的helloworld [【python opencv 計算機視覺零基礎到實戰】二、 opencv文件格式與攝像頭讀取] 一、opencv的helloworld [[python opencv 計…

【經典回放】JavaScript學習詳細干貨筆記之(二)

【經典回放】JavaScript學習詳細干貨筆記之(一) 【經典回放】JavaScript學習詳細干貨筆記之(二) 【經典回放】JavaScript學習詳細干貨筆記之(三) 一、JavaScript 數組 JavaScript數組的定義、使用都是非常簡單的,從a17.htm就可以知道,僅僅定義的話,就使用: var …

java string類api_java基礎—String類型常用api

1、字符串比較equalsequalsIgnoreCase 忽略大小寫做比較2、字符串拆分(切片)splitString a "lemon:python:Java";//split切片之后的結果是一個一維字符串類型數組String[] arr a.split(":");for(int i 0 ;i System.out.println(arr[i]);}3、字符串截取…

解決沖突

人生不如意之事十之八九&#xff0c;合并分支往往也不是一帆風順的。 準備新的feature1分支&#xff0c;繼續我們的新分支開發&#xff1a; $ git checkout -b feature1 Switched to a new branch feature1修改readme.txt最后一行&#xff0c;改為&#xff1a; Creating a new …

Android之java.lang.OutOfMemoryError: Failed to allocate a ** byte allocation with **free bytes and 2M

1 問題 glide加載圖片出現oom java.lang.OutOfMemoryError: Failed to allocate a 23970828 byte allocation with 2097152 free bytes and 2MB until OOM 2 解決辦法 1) 簡單粗暴點的在AndroidManifest.xml添加如下&#xff0c;增大安卓虛擬機內存 android:largeHeap"…

HQL入門學習

2019獨角獸企業重金招聘Python工程師標準>>> package myHibernate; /** 測試簡單的HQL語句* 2010年4月9日 23:36:54* */ import java.text.ParseException; import java.text.SimpleDateFormat; import java.util.Calendar; import java.util.Date; import java.uti…

Oracle精簡客戶端配置

2019獨角獸企業重金招聘Python工程師標準>>> 由于Oracle client體積很大。而且安裝后&#xff0c;基本上就用2個功能&#xff1a;TNS配置服務名和SQL*Plus。下面是一種小巧、快捷的Oracle客戶端配置方法&#xff1a; 1.下載Instant Client 下載地址&#xff1a; htt…

【經典回放】JavaScript學習詳細干貨筆記之(三)

【經典回放】JavaScript學習詳細干貨筆記之(一) 【經典回放】JavaScript學習詳細干貨筆記之(二) 【經典回放】JavaScript學習詳細干貨筆記之(三) 一、再次從var開始說起 var到底是什么? 在前面的所有介紹中, JavaScript的var變量說明、是非常令人迷惑的事情。 var中…

WinUI遷移到.NET MAUI個人體驗

遷移的初衷本人平時是做.net相關的工作&#xff0c;對于.net技術棧也有一些了解&#xff0c;自從新的.net能夠跨平臺之后&#xff0c;之前也有跨平臺的ui框架Xamarin&#xff0c;現在微軟推出了.NET MAUI這個說是 統一了開發體驗&#xff0c;而且都RC版本了&#xff0c;所以本人…

祝CSDN2021牛氣沖天祝我也撥云散霧

前言 2020年4月&#xff0c;我寫了一篇用turtle繪制《小清新風格的樹》&#xff0c;反響挺好。現在打算使用turtle修改一下繪制方式&#xff0c;因為線條的繪制太過考慮因素過多&#xff0c;如果使用方塊進行堆疊&#xff0c;繪制出來的形狀可以如馬賽克一樣&#xff0c;既符合…