如何優雅的生成乙個 diff patch

2021-09-11 06:44:21 字數 3154 閱讀 4721

某天如果你要把一條 git 或 svn 記錄的修改傳送給其他人時我們要怎麼做呢?

在 git 下你可以這麼做:

git format-patch 【commit sha1 id】 -1
這樣會生成單條記錄的 patch 檔案,當然也可以生成多條或者兩條 commit 記錄之間的修改。

例如我們在開源專案 nuklear 上執行如下命令生成一條記錄的 patch

git format-patch 181cfd86c47ae83eceabaf4e640587b844e613b6 -1
我們會在當前目錄下得到乙個 0001-add-nk_keystate_based_input-changes-to-src-files.patch 檔案

那我們可以把這個檔案發給其他人,其他人打入 patch 也很簡單,使用如下命令

整個過程看起來很輕鬆,可一旦發生衝突就麻煩了,而且整個過程看起來黑漆漆的,不知道這個 patch 修改了些什麼東西。

當然 .patch 我們是可以開啟來看的,裡面有一定的規則指明做了哪些改動,但不是特別直觀,如下圖:

解決衝突的時候我們最好能很直觀的知道這條記錄到底改動了哪些東西。

相信大家肯定都用過 bcompare 這個神器,能很清楚的展示兩個目錄或檔案間的差異,

如果能在提供 .patch 檔案的同時提供這條記錄修改檔案的前後分別放在乙個 old 乙個 new 目錄,然後用 bcompare 對比來看下,是不是更好?

這裡我們以 svn 舉例(因為我們的實際專案是使用 svn 管控**的)來生成這樣乙個可以用 bcompare 對比著來看的 patch。

我們先找到如下這樣一條 svn 記錄:

最終我們要匯出這種效果:

那我們應該怎麼做呢?

如上,我們要在保證目錄層級關係的情況下只匯出這條記錄修改過的檔案。

對於得到這條記錄修改哪些檔案我們可以使用如下命令來得到,

svn diff -r ***0:***1 --summarize svn-link
svn co --depth empty svn_repository       /* checkout 乙個空的目錄 */

svn up --depth empty svn_repository_dir /* up 乙個空的目錄,實際對檔案也有效 */

有了大致思路後我們就用 python 來實現它吧,最後我的實現如下:

如何優雅關閉乙個執行緒

當我們去thread類裡面找相關的介面時,發現有 個stop方法,看上去非常適合用來終止乙個執行緒,但是這個方法上面標了個 deprecated註解,非常明顯,這是乙個廢棄方法,不建議使用它。主要有兩個方面的原因 因為這個方法會將執行緒直接殺掉,沒有任何喘息機會,一旦執行緒被殺死,後面的 邏輯就再也...

如何優雅的停止乙個執行緒

首先我們先了解下,執行緒是分為使用者執行緒和守護執行緒的,他們的區別就在 使用者執行緒當我們的主線程停止後,使用者執行緒不會隨著主線程停止。守護執行緒當我們的主線程停止後,會跟隨著主線程一起停止。一般我們建立的都是使用者執行緒,那守護執行緒有哪些呢,例如跟程式一起啟動的gc執行緒就是守護執行緒。停止...

C 如何優雅的結束乙個執行緒

有乙個無線迴圈的執行緒需要時時接收資料,如下 class eventclass event recedatasdone?invoke this,eventargs.empty public void stoprecedatas class program ec.startrecedatas syst...