1

理想情况下,我正在寻找一种无状态的方式来执行此操作,因为我使用的是批处理文件。

场景是我在接收用户推送的服务器上有一个存储库。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语句的用途。

请注意,到目前为止,我并不关心脚本的改进。它已被审查为我们在此环境中进行更新的理想方式。

最后副本的问题是它会复制所有图形,无论它们是否已更改。显然,最好只复制已更改的图形。由于自上次更新以来可能已经多次推送到此存储库,我只想识别和复制自上次更新此工作副本以来已更改的那些图形,即上次运行此脚本的时间hg update

我想不出一种直观的方法来做这件事。如果在脚本运行之间不需要手动保存信息,那将是最好的,但这并不是不可能的。

4

2 回答 2

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
于 2011-05-12T15:58:26.863 回答
0

您可能能够摆脱使用xcopy及其/D开关,它只复制比目标文件新的源文件。

于 2011-05-12T16:38:43.000 回答