Windows 通过批处理文件在GIT中创建已修改文件的存档
我使用此git命令创建在特定提交中修改的文件的存档:Windows 通过批处理文件在GIT中创建已修改文件的存档,windows,git,batch-file,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。我遇到的问
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。我遇到的问题是,从批处理文件运行此命令时返回以下错误:
错误:未知选项“仅名称”
我猜可能会有一些角色逃避的问题,但我无法找到具体的突破点
我应该如何编写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
假设您需要的是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
命令的文档是,包括/f
开关。setlocal
命令的文档是。如果在批处理文件中的git archive
命令前面放一个echo
,它是否会显示您希望它显示的内容?是的,它似乎格式正确echo输出中的y。确保您的命令中没有奇怪的字符。我碰巧在命令中有“不可见”的控制字符…我检查并验证了没有错误字符。这是Windows.bat
文件还是cygwin bash脚本?我认为您不能使用$(foo)
要在Windows.bat
文件中获取命令的输出,您需要为/f“delims=“%%a in('git diff--name only%1^^')使用奇怪且模糊的,设置output=%%a
,然后在后续命令中使用%output%
。您可能应该将其引用为%output%”
也是。如果我有一组较大的文件,并且收到错误“输入行太长。命令语法不正确”,我该怎么办?