2014-02-07 52 views
4

我使用這個混帳命令創建中的特定修改過的文件的歸檔承諾:通過批處理文件創建GIT修改過的文件的歸檔

git archive -o update.zip HEAD $(git diff --name-only COMMITID^) 

其中的commitid是提交的我的ID正在尋找檔案。這從命令行工作正常,但我想從批處理文件運行它。以下是我正在使用的批處理文件的內容:

git archive -o update.zip HEAD $(git diff --name-only %1^^) 

其中%1是通過SourceTree傳入的提交ID。我遇到的問題是,從一個批處理文件運行時,此命令將返回以下錯誤:

error: unknown option `name-only'

我猜可能有一些字符轉義問題去,但我無法找到什麼特別斷。

我該如何編寫git命令,以便它能從批處理文件中工作?

UPDATE

我試圖消除唯一--name選項,並通過SourceTree試圖批處理腳本時收到以下錯誤:

fatal: path not found: $(git

希望這有助於縮小範圍可能是什麼回事。

進一步更新

原來我的語法是錯誤的,從一個特定的提交抓只修改過的文件,但使用msandiford的答案,我想出了這個批處理文件腳本,完美的作品:

setlocal enabledelayedexpansion 
set output= 
for /f "delims=" %%a in ('git diff-tree --no-commit-id --name-only -r %1^^') do (set output=!output! "%%a") 
git archive -o update.zip HEAD %output% 
endlocal 
+0

如果你在你的批處理文件的'git archive'命令前面加了一個'echo',它會告訴你你期望的結果嗎? – Mark

+0

是的,它似乎在回聲輸出中格式正確。 – hereswhatidid

+0

確保您的命令中沒有奇怪的字符。發生在我身上的是我在命令中有「隱形」控制字符... – vonbrand

回答

9

假設你需要一個Windows批處理文件,而不是一個bash腳本,這裏是一個最小的批處理文件,可以做你想做的:

setlocal enabledelayedexpansion 
set output= 
for /f "delims=" %%a in ('git diff --name-only %1^^') do (set output=!output! "%%a") 
git archive -o update.zip HEAD %output% 
endlocal 

它通過收集將git diff ...命令輸出的所有行轉換爲環境變量,然後使用此命令執行git archive ...操作。

Windows for命令的文檔是here,其中包括/f開關。 setlocal命令的文檔是here

+0

完美,謝謝! – hereswhatidid