Mercurial 命令用于识别与文件规范匹配且自上次更新以来已更改的文件
理想情况下,我正在寻找一种无状态的方法来执行此操作,因为我使用的是批处理文件。
场景是我在服务器上有一个存储库,用于接收用户的推送。该存储库也是一个工作副本,它是 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 时)以来已更改的那些图形更新
。
我想不出一种直观的方法来立即完成此操作。如果不需要在脚本运行之间手动保留信息,那就最好了,但这也不是不可能的。
Ideally, I'm looking for a stateless way to do this since I'm using a batch file.
The scenario is that I have a repository on a server that receives pushes from users. The repo is also a working copy that is the source for wiki pages (dokuwiki), which are simply the text files that are in the repository, one for each page in the wiki.
Because this is on a web server, the working copy isn't used by anyone interactively. Rather, a batch file runs periodically and issues the appropriate commands to keep the working copy updated with the latest changes that have been pushed to the repo. As a side note to the implementation, it also accepts changes to the working copy from the wiki and tries to merge and commit them at the same stroke.
The batch file looks like this:
@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
This works fine for the text files, but dokuwiki requires that media such as graphics be stored in another directory, which is what the last for
statement is for.
Note that I'm not concerned with improvements to the script up to that point. It's been vetted as our desired way to do the update in this environment.
The issue with the copy at the end is that it copies all graphics irrespective of whether they've changed or not. Obviously, it would be better to only copy the graphics which have changed. Since there may have been more than one push into this repository since the last update, I want to identify and copy only those graphics which have changed since the last time this working copy was updated, i.e. the last time this script ran hg update
.
I can't think of an intuitive way to do this off-hand. It would be best if information didn't need to be persisted manually between script runs, but it's not out of the question.
如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。
绑定邮箱获取回复消息
由于您还没有绑定你的真实邮箱,如果其他用户或者作者回复了您的评论,将不能在第一时间通知您!
发布评论
评论(2)
我不知道 Windows 批处理文件的语法,但 Mercurial 的
hg status --rev REV
可能就是您正在寻找的:I have no idea about the syntax of Windows batch files, but Mercurial's
hg status --rev REV
is probably what you're looking for:您也许可以使用
xcopy
及其/D
开关,该开关仅复制比目标中的文件新的源文件。You may be able to get away with using
xcopy
and its/D
switch, which copies only source files that are newer than files in the destination.