通过批处理文件在GIT中创建已修改文件的存档

时间:2014-02-07 23:07:22

标签: windows git batch-file

我正在使用此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。我遇到的问题是,从批处理文件运行时此命令会返回以下错误:

  

错误:未知选项`name-only'

我猜测可能会有一些角色逃避问题,但我无法找到特别突破的内容。

我如何编写git命令以便它可以从批处理文件中运行?

更新

我尝试删除--name-only选项,并在通过SourceTree尝试批处理脚本时收到以下错误:

  

致命:未找到路径:$(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

1 个答案:

答案 0 :(得分:10)

假设您需要一个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