获取分支中给定目录的所有已更改文件

时间:2011-05-26 06:19:32

标签: logging mercurial

我们的项目最近从SVN切换到Mercurial。在SVN中,为了对我们的css / js文件进行版本化,我们从它们所在的目录中获取最新的修订版本,并将其用作打包文件名的前缀。

我们想在Mercurial中使用相同的方法。不幸的是,说起来容易做起来难,但可能是由我们的分支方法造成的。

简而言之,我们有一个主分支(主干)。每隔几周我们就会从主干分支创建一个生产测试版,最终将合并到我们的实时分支中。

现在,我们基本上正在使用

hg log -b live some_folder/js
hg log -b live some_folder/css

获取最近更改了这些目录中文件的变更集。

我们遇到的问题是我们的合并更改集未使用此方法检测到。因此,如果我们合并修改some_folder / css中的文件的变更集,则hg不会将其视为已更改,因为该文件实际上未在合并变更集中进行修改,而是在其中一个正在合并的变更集中。

我们还尝试过revsets来尝试解析日志,但它似乎也有同样的问题。获取hg日志以将这些文件列为已更改的唯一方法似乎是使用--stat选项,但

hg log -b live --stat some_folder/css

也没有显示更改集。

我正在考虑使用

hg log -b live --stat

获取整个分支的日志,然后解析它以找到最近修改了目录文件的变更集,但我不愿意,因为它似乎会变得越来越慢,因为分支获得大。

有关解决问题的更好方法的任何想法吗?

2 个答案:

答案 0 :(得分:2)

我将通过声明我目前没有在此PC上安装Mercurial来解释这个答案,因此无法验证命令,但它至少可能指向一个有用的(?)方向。

您可以使用hg status指定--rev选项来获取两个修订版之间的更改列表,因此使用修订版表示法,您可以执行以下操作:

hg status -b live --rev -2:-1 some_folder/css

理论上(这里我的地方非常错误:)),选项意味着:

--rev -2:-1选择工作目录的父级(我假设您在合并后仍然会在那里),并将其与其父级(-2)进行比较。指定-b live将有希望选择该分支中的父级,但正如我所说,我现在无法对此进行测试。

答案 1 :(得分:0)

最后没有一种简单的方法可以做到这一点,所以我采用了以下方法: 在过去的x天内抓取分支的所有日志。使用stat命令迭代所有这些日志,并在影响给定分支的第一个修订上停止。如果该日期范围内的任何一个都不影响给定路径,请抓住下一个x天的日志。所以:

hg log -b live -r "reverse(date('2011-05-12 to 2011-05-26'))" --template "{node} "

然后为每个变更集

hg st --change <the_changeset> -I "some_folder/css"

当这返回任何空值时,我停止循环并返回变更集ID。希望在某些时候,revsets将支持迭代合并的更改。

相关问题