天天看點

git提取出兩個版本之間的差異檔案并打包 git提取出兩個版本之間的差異檔案并打包

git提取出兩個版本之間的差異檔案并打包

 Linux運用 陳傑斌

  3年前

(2013-09-11)  22678浏覽  

3評論 [編輯]

公司的項目原先是使用svn做版本管理,釋出項目的時候是采用打包的方式壓縮成zip格式的檔案,然後用ftp上傳。随着開發人員越來越多,需求變化也比較多,經常在開發新功能時要調整線上的問題,在一個分支上進行開發就非常不友善。雖然svn也支援多分支開發,但是操作非常不便,于是就把項目的版本管理切換成了git。

切換成git之後,為了平緩的過度,釋出項目的時候還是打算使用打包的方式,然後ftp上傳。那麼問題就來了:git如何提取出兩個送出之間的差異檔案呢?

一開始找了git format-patch和git archive都沒有找到需要的功能,後來就去查git diff指令,找到了方法。

git diff這個指令能比較兩個送出之間的差異,使用–name-only參數可以隻顯示檔案名。例如:

$ git diff 608e120 4abe32e --name-only      
git提取出兩個版本之間的差異檔案并打包 git提取出兩個版本之間的差異檔案并打包

git diff列出兩個送出之間差異的檔案

這個輸出結果非常有意思,就是差異檔案的相對位址,不正好是壓縮指令的參數嗎?于是立馬使用壓縮指令

$ zip update.zip c/environ.c ... 所有的檔案...      

就能成功打包了。隻是這樣的話也太麻煩了吧,幸好linux有提供一個指令xargs能将前一個指令的輸出轉成另外一個指令的參數,按照這個思路就非常簡單了。

$ git diff 608e120 4abe32e --name-only | xargs zip update.zip      
git提取出兩個版本之間的差異檔案并打包 git提取出兩個版本之間的差異檔案并打包

結合xargs進行打包

總結

其實這種釋出方式并不是非常好,如果線上的環境也能使用版本管理就非常友善了,隻是這需要多方面的的配合。從某種意義上來講,這種打包更新方式隻是一種折中的處理方式。

還一個問題是這樣的:送出的排序是按照時間來進行的,如果有分支合并進來的,可能分支裡的送出時間在上次釋出的送出時間之前,這樣是否會漏打包到檔案呢?答案是不會的,因為合并分支會産生一個新的送出,這個送出一定是在上次釋出的送出之後。

繼續閱讀