确定何时从另一个分支合并文件(Mercurial)

时间:2015-08-03 12:24:51

标签: mercurial tortoisehg

我们目前正在使用Mercurial来管理我们的代码,并设置了两个主要分支;默认和稳定。

我们希望能够找到何时将特定文件添加到稳定分支,但无法确定这是如何实现的。

作为一个例子,我们有一个在稳定分支中的文件(默认合并),但是当试图确定文件被合并到稳定分支的哪个阶段时,我们只能看到文件被添加到的时间存储库(默认分支)。

即。

hg log <filename> --verbose 

...仅显示一个变更集。

通过遍历每个必要修订的繁琐过程并确定文件出现在哪个文件时,可以计算出添加它的时间,但希望有更优雅的方法!

编辑:以下步骤可用于演示此问题:

hg init

echo "syntax: glob" > .hgignore
hg addremove
hg commit -u testuser -m "new repository"


hg branch stable
hg commit -u testuser -m "new branch"
hg update default

echo "The quick red fox jumps over the lazy brown dog." > test.txt 
hg addremove
hg commit -u testuser -m "new file"

hg update stable
hg merge default
hg commit -u testuser -m 'mock release'
hg update default
hg merge stable
hg commit -u testuser -m "switch to development branch (default)"

test.txt文件现在是稳定存储库的一部分......

hg update stable --clean
hg log .\test.txt

changeset:   3:ca4338ed2c56
user:        testuser
date:        Mon Aug 03 15:52:48 2015 +0100
summary:     new file

...但是使用-b stable选项时,不会显示任何结果。

1 个答案:

答案 0 :(得分:0)

你可以在hg log中使用revsets(更长的方式,更好的结果)或者选择更短(并且稍微脏一点)的日志选项和眼睛:

hg log FILENAME -b stable将生成更改集列表,最早(通过rev-id)将在分支中出现FILENAME的时刻

修改 使用此类历史记录测试样本仓库

hg log -v

changeset:   4:b9ab93cb4a0a
tag:         tip
parent:      2:4733dc2d6b62
parent:      3:bdd73f64f96f
user:        *
date:        Wed Aug 05 00:37:55 2015 +0500
description:
Back to devel


changeset:   3:bdd73f64f96f
branch:      stable
parent:      1:7c6de35e9ca2
parent:      2:4733dc2d6b62
user:        *
date:        Wed Aug 05 00:36:54 2015 +0500
description:
Mock release

changeset:   2:4733dc2d6b62
parent:      0:81adee946a99
user:        *
date:        Wed Aug 05 00:35:13 2015 +0500
files:       test.txt
description:
File added

changeset:   1:7c6de35e9ca2
branch:      stable
user:        *
date:        Wed Aug 05 00:33:26 2015 +0500
description:
Stable branch created

changeset:   0:81adee946a99
user:        *
date:        Wed Aug 05 00:32:22 2015 +0500
files:       .hgignore
description:
New repo

(注意某些变更集中缺少“文件”,尤其是 - 合并集:未触动的文件在列表中不会出现),但

hg  log -r "contains('test.txt')" -T "{rev}:{node|short} - {branch}\n"
2:4733dc2d6b62 - default
3:bdd73f64f96f - stable
4:b9ab93cb4a0a - default

因为hg help revsets

  

“含有(图案)”
  修订版的清单包含文件匹配   模式(但可能不会修改它)。

和最终(额外抛光)revset for log:contains('test.txt') and branch (stable) and merge()

hg  log -r "contains('test.txt') and branch (stable) and merge()" -T "{rev}:{node|short}\n"
3:bdd73f64f96f

对于大量的合并操作,您可能希望将谓词包含在谓词first()中,以便获得第一个出现的文件。并且这样的revset(参数化)是将其添加[revsetalias]并且可能使用revsetalias记录到[alias]

的良好候选者。

<强>样品2

在真实HGSubversion repository上使用随机文件

hg  log -r "contains('tests/test_pull.py') and branch (stable) and merge()" -T "{rev}:{node|short}\n"
1106:5cb6c95e0283
1255:139a44a63090
1303:553c40023729
1323:6fd0ec01553b