2

如果我使用 log -k 它会拉出两个变更集,但是当我添加 --follow 或 -f 时它会错过其中一个。为什么会这样?

(我认为 --follow 只能变更集添加到返回的集合中,即在名称更改为当前名称之前修改了所选文件的那些。)

4

3 回答 3

1

-f选项仅遵循起始修订的祖先/后代的历史。

我的猜测是-k(关键字搜索)正在从您的存储库中的两个分支返回结果。因此,通过添加-f/ --follow,您将结果限制为与起始修订直接相关的变更集。

于 2012-06-29T20:17:57.113 回答
1

我回到这里是因为我终于(大部分)得到了 --follow 保留的内容和丢弃的内容。尽管爱德华基本上是对的,但在测试了他的答案后我感到很困惑,因为我误解了“开始修订”的含义,而且它遵循祖先/后代的方式存在一些细微差别,导致结果没有符合我的预期。

这是一个带有简单分支的存储库:

% hg glog --template {rev}   
@  2
|
| o  1
|/
o  0

% hg glog --template {rev} -r '0+1+2'
@  2
|
| o  1
|/
o  0

% hg glog --template {rev} -r '1+2+0'
@  2
|
| o  1
|/
o  0

下一个示例使用--follow说明了与规范相关的“起始修订”--follow是规范中的第一个(不是存储库中最早的或类似的),甚至随后的排序也很重要。

如果我们从共享祖先开始,一切都包括在内。

% hg glog --template {rev} -r '0+1+2' --follow
@  2
|
| o  1
|/
o  0

如果我们不这样做,那么结果甚至取决于后面的顺序。看起来它可以遍历图,但只能在一个方向(祖先或后代,但不能在同一个调用中)。

% hg glog --template {rev} -r '1+2+0' --follow
o  1
|

% hg glog --template {rev} -r '1+0+2' --follow
o  1
|
o  0

如果您手动订购,这不仅仅是一个问题。使用基本原语,您可能会以不同的顺序进行修订,从而导致混乱的行为。

% hg log --template {rev} -r 'all()'
012
% hg log --template {rev} -r 'all()' --follow         
012
% hg log --template {rev} -r 'reverse(all())'
210
% hg log --template {rev} -r 'reverse(all())' --follow
20

对于它的作用,我仍然没有一个清晰简洁的规范,而且我认为生成“安全”的修订集是很棘手的。(由于这个原因,当从结果中删除变更集时,hg 是否会发出警告消息?)所以当我进行依赖于 --follow 的棘手处理时,我也运行没有 --follow,比较以确保我不是失去任何东西。

于 2014-03-31T22:52:06.850 回答
1

我认为您的期望是有效--follow的,当与其他选项结合使用时,我发现它有点错误。

查看这些已确认的(并且有些旧的)错误:

对我来说,一种解决方法是使用--rev "follow('my/filename')"revset 语法,而不是有问题的--follow标志。

也许试一试?

于 2017-09-03T17:47:13.523 回答