我知道如何使用hg blame
来查找确切的提交更改了文件中的一行,但是我找不到类似的方法来查找文件上的可执行位更改时。
答案 0 :(得分:16)
首先请注意,由于exec位中的更改不会影响文件内容(如删除),因此它们不一定会显示为“hg log filename”。 (Unix书呆子可以比较rm / chmod的文件和目录的ctime / mtime规则来理解这种区别。)所以你需要使用类似的东西:
$ hg log --deleted file
显示触摸文件的所有更改集,包括exec更改,删除和重复项。默认情况下不会出于各种原因启用此功能,包括它可能会慢一个数量级。
在阅读日志时查找exec位也意味着查看git样式的补丁,因为标准补丁(1)兼容的补丁不知道exec位。因此总命令可能类似于:
$ hg log --removed -pg contrib/simplemerge | grep "^new mode" -B 10
+ import os
sys.exit(main(sys.argv))
changeset: 4363:2e3c54fb79a3
user: Alexis S. L. Carvalho <alexis@cecm.usp.br>
date: Mon Apr 16 20:17:39 2007 -0300
summary: actually port simplemerge to hg
diff --git a/contrib/simplemerge b/contrib/simplemerge
old mode 100644
new mode 100755
其内容为:“在'simplemerge上搜索所有git补丁,以'新模式'开头并显示前10行”。
另一种选择是使用bisect。这可以用于找到您可以测试的基本上任何类型的更改。例如,如果您正在寻找X位的设置位置:
$ hg bisect -g 1000 # some past revision without the X bit
$ hg bisect -b tip # some recent revision with the X bit
Testing changeset 8114:ad3ba2de2cba (14179 changesets remaining, ~13 tests)
993 files updated, 0 files merged, 716 files removed, 0 files unresolved
$ hg bisect -c "[ ! -x contrib/simplemerge ]" # shell expression returns 0 (good) if no x bit
Changeset 8114:ad3ba2de2cba: bad
Changeset 4566:087b3ae4f08a: bad
Changeset 2797:a3c6e7888abf: good
Changeset 3678:7e622c9a9707: good
Changeset 4121:d250076824e3: good
Changeset 4345:ec64f263e49a: good
Changeset 4454:28778dc77a4b: bad
Changeset 4403:15289406f89c: bad
Changeset 4371:d7ad1e42a368: bad
Changeset 4355:10edaed7f909: good
Changeset 4366:390d110a57b8: bad
Changeset 4363:2e3c54fb79a3: bad
Changeset 4361:99c853a1408c: good
Changeset 4362:465b9ea02868: good
The first bad revision is:
changeset: 4363:2e3c54fb79a3
user: Alexis S. L. Carvalho <alexis@cecm.usp.br>
date: Mon Apr 16 20:17:39 2007 -0300
summary: actually port simplemerge to hg
在这里,我们使用标准的Bourne shell表达式自动化测试以检查文件的exec位,然后Mercurial会检查修订并为我们测试它们。
答案 1 :(得分:4)
可能没有一个简单的内置方法la hg blame
(或者可能有,我只是不知道它!),但你应该能够使用暴力方法来通过观察差异来追捕变化集。
首先,你需要启用git-style diffs,因为hg的普通diff输出不会显示文件模式的变化。为此,请在hgrc
添加以下内容:
[diff]
git = True
然后,您可以查看您感兴趣的文件的所有差异,并通过运行以下命令找到更改模式的提交:
hg log -p file_of_interest
如果您使用的是* nix系统,则可以通过管道less
或grep
轻松搜索输出。模式更改应显示在以:
diff --git a/file_of_interest b/file_of_interest
old mode ....
new mode ....
因此,例如,您可能正在寻找从644
(无exec)到755
(exec位设置)的模式更改,在这种情况下,您会看到类似的内容:
old mode 100644
new mode 100755
一旦你发现你之后的差异包含你所追求的模式改变,你可以向后搜索以获得提交哈希值。
不像hg blame
那么简单,但它应该在某种程度上起作用。希望有所帮助。