2010-08-06 86 views
21

Git有非常方便的archive命令,它允許我做一個特定的副本中的.zip檔案提交像這樣:郵編最新提交的修改

git archive -o ../latest.zip some-commit

這將包含整個工作樹承諾。通常我只需要自上一版本以來更改過的文件。目前我使用它來獲取這些文件壓縮成zip:

git diff --name-only previous-commit latest-commit | zip ../changes.zip [email protected]

然而這會從我的工作拷貝,這可能有未提交的修改ZIP文件。有沒有什麼辦法只獲取更改後的文件,因爲它們直接提交到壓縮文件中?

回答

38

git archive將接受路徑作爲參數。所有你應該需要做的是:

git archive -o ../latest.zip some-commit $(git diff --name-only earlier-commit some-commit) 

,或者如果你有帶空格(或其他特殊字符)文件,請使用xargs的:

git diff --name-only earlier-commit some-commit | xargs -d'\n' git archive -o ../latest.zip some-commit 

如果沒有xargs的正確安裝,你可以編造一個選擇:

#!/bin/bash 

IFS=$'\n' 
files=($(git diff --name-only earlier-commit some-commit)) 

git archive -o ../latest.zip some-commit "${files[@]}" 

寫成一個shell腳本,而應該作爲一個班輪工作了。或者,將earlier-commit,some-commit../latest.zip更改爲$1$2$3並且您已爲自己創建了可重複使用的腳本。

+0

不錯的一個!這很好。 – 2010-08-06 14:05:47

+5

請注意,提取這樣的檔案不會刪除任何文件。這可能會導致以後很難診斷問題。 – jilles 2010-08-06 16:30:20

+0

@jilles:非常真實。這就是爲什麼補丁很好。 @Marnix van Valen:你也許可以直接生成補丁,然後用腳本包裝它(甚至可以使用heredoc將它全部保存在一個文件中) - 那麼它將是可用的,而且是正確的。 – Cascabel 2010-08-06 17:42:29

-1

爲什麼不創建一個git補丁,然後可以應用到其他代碼庫?

$ git format-patch HEAD^..HEAD 
+1

不是每個人都知道如何使用補丁文件,我很害怕。我用它來爲我的客戶提供新版本。解壓縮存檔是非開發人員可以做的事情。應用補丁需要的技能並不是我所有的客戶都掌握(甚至想要掌握)。 – 2010-08-06 12:31:18

4

如果要創建一個補丁是不是一種選擇,那麼如何對這樣的事情:

git stash 
git checkout latest-commit 
git diff --name-only previous-commit | zip ../changes.zip [email protected] 
git checkout master 
git stash apply 

注意:如果您有尚未提交工作副本的變化時,才需要該git stashgit stash apply

備註2:git checkout latest-commit會讓您置身於一個獨立的頭部。當你完成時,一定要git checkout master,否則你可能會在將來的提交中遇到問題。

+0

我是一種希望單一的命令解決方案...... – 2010-08-06 12:33:43

+0

@Marnix van Valen那麼爲什麼不把它變成一個簡單的腳本(或批處理文件)?問題是你需要將文件名列表翻譯成特定的版本。我能想到的唯一方法是使用'git show latest-commit:file'。但是,我沒有想出一個班輪來做到這一點。它看起來像這樣:'git diff --name-only previous-commit | xargs -I文件git顯示最新提交:文件... ...但這是問題。這將打印文件(不帶名稱)到STDOUT。如何將其轉換成zip文件? – 2010-08-06 12:57:05

2

爲了實現一些有用的東西來解決這個問題,我已經實現了一個簡單的bash腳本。該腳本獲取修訂散列並創建一個包含目錄層次結構在內的所有已更改文件的tar.gz存檔。 任何人都可以使用它或修改,如果它能幫助某人,我會很高興。

只需在作爲git存儲庫的根目錄中運行腳本,並將修訂哈希傳遞到命令行參數argumens。

Link to the script on hithub

+0

這個例子看起來像這樣: #。/ do_delivery.sh -r a5ab48cdbb -n「vmeagt_delivery」 ===>檔案文件名:「vmeagt_delivery-20120430」 ===>受影響的版本:「a5ab48cdbb - > HEAD」 ===>輸出路徑:「/ Users/crible/Projects/ServerView_Agents /「 ===> Git repository:」/ Users/crible/Projects/ServerView_Agents /「 ===>創建tar.gz存檔... ===>完成! – 2012-04-30 15:55:42

+0

這只是第一個版本,強烈需要改進:) – 2012-04-30 15:56:56

1

我有COMME了一個解決方案,一個線很簡單:

zip archive.zip $(git diff-tree --no-commit-id --name-only -r latest-commit) 

您可以和使用任何其他歸檔方法類似焦油用這種方法。