理想情况下,我正在寻找一种无状态的方法,因为我正在使用批处理文件。
场景是我在服务器上有一个存储库,用于接收来自用户的推送。 repo也是一个工作副本,它是wiki页面(dokuwiki)的源代码,它只是存储库中的文本文件,wiki中的每个页面都有一个文本文件。
因为这是在Web服务器上,所以任何人都不会以交互方式使用工作副本。相反,批处理文件会定期运行并发出相应的命令,以使工作副本更新为已推送到存储库的最新更改。作为实现的附注,它还接受来自wiki的工作副本的更改,并尝试以相同的笔划合并和提交它们。
批处理文件如下所示:
@echo off
cd \dokuwiki\data\directory
start /wait cmd.exe /c hg update
start /wait cmd.exe /c hg resolve -m -a
start /wait cmd.exe /c hg resolve -a
start /wait cmd.exe /c hg commit -A -m "Automated commit"
for /r %%x in (*.jpg *.png *.gif) do copy /y "%%x" ..\..\media\directory
这适用于文本文件,但是dokuwiki要求将图形等媒体存储在另一个目录中,这是最后for
语句的目的。
请注意,到目前为止,我并不关心脚本的改进。它已被审查为我们在此环境中进行更新的理想方式。
最后副本的问题在于它复制所有图形而不管它们是否已经改变。显然,仅复制已更改的图形会更好。由于自上次更新以来可能不止一次推入此存储库,因此我想识别并复制自上次更新此工作副本以来已更改的那些图形,即此脚本最后一次运行{{1} }。
我无法想到一种直观的方式来做到这一点。最好是在脚本运行之间不需要手动持久保存信息,但这不是不可能的。
答案 0 :(得分:4)
我不知道Windows批处理文件的语法,但Mercurial的hg status --rev REV
可能是您正在寻找的内容:
@echo off
cd \dokuwiki\data\directory
ORIG_REV = hg log --rev . --template="{node}"
start /wait cmd.exe /c hg update
start /wait cmd.exe /c hg resolve -m -a
start /wait cmd.exe /c hg resolve -a
start /wait cmd.exe /c hg commit -A -m "Automated commit"
CHANGED_FILES = hg status --no-status --added --modified --rev ORIG_REV -I '*.jpg' -I '*.png' -I '*.gif'
for /r %%x in (CHANGED_FILES) do copy /y "%%x" ..\..\media\directory
答案 1 :(得分:0)
您可以使用xcopy
及其/D
开关,它只复制比目标中的文件更新的源文件。