Mercurial命令,用于识别与filespec匹配且自上次更新以来已更改的文件

StackOverflow https://stackoverflow.com/questions/5980602

  •  12-11-2019
  •  | 
  •  

理想情况下,我正在寻找一种无状态的方式来做到这一点,因为我使用的是批处理文件。

场景是我在服务器上有一个存储库,该存储库接收来自用户的推送。回购也是一个工作副本,它是维基页面(dokuwiki)的来源,这些页面只是存储库中的文本文件,每个页面都有一个。

因为这是在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.

我想不出一个直观的方法来做到这一点。如果信息不需要在脚本运行之间手动持久化,那将是最好的,但这并不是不可能的。

有帮助吗?

解决方案

你也许可以逃脱使用 xcopy 而其 /D 切换,它仅复制比目标中的文件更新的源文件。

其他提示

我不知道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
许可以下: CC-BY-SA归因
不隶属于 StackOverflow
scroll top