2010-02-05 78 views

回答

10

在善变1.4及更高版本可以使用summary命令更优雅,这使输出这样当变化存在:

$ hg summary 
parent: 0:ad218537bdef tip 
commited 
branch: default 
commit: 1 modified 
update: (current) 

这个提交后:

$ hg summary 
parent: 1:ef93d692f646 tip 
sfsdf 
branch: default 
commit: (clean) 
update: (current) 

另外,还可以安装prompt extension,做这样的事情:

$ hg prompt '{status}' 

将输出一个!?或没有适当的。

这两者当然只是替代文本输出。我找不到任何直接使用退出代码的东西,但是由于$?检查你可以做的管道中的最后一个命令?

hg summary | grep -q 'commit: (clean)' 

这将设置$?非零如果有任何更改未提交:

$ hg summary | grep -q 'commit: (clean)' ; echo $? 
0 
$ echo more >> that 
$ hg summary | grep -q 'commit: (clean)' ; echo $? 
1 
+0

感谢您的回答。我结束了(在zsh中)'[[“没有改变”=''hg ci -m tick'']] || hg推'。我不喜欢它,因为在某些未来版本的mercurial中,确切的措辞可能会改变(这也适用于您的hg摘要解决方案)。是的,'hg prompt'{status}''应该可以正常工作,除了我更喜欢使用核心hg功能,因为脚本将在外部主机上运行,​​所以我的自定义扩展(手动更新)有一天会变得不可兼容hg(autoupdated)版本。 – 2010-02-06 18:14:35

+1

看起来好像mercurial不是被设计成和git一样在脚本中使用,是吗? – 2010-02-06 18:15:09

+2

您对字符串更改的担忧是有道理的,但是在不同的语言环境下运行不够,我认为这不会成为问题。 mercurial的作者Matt Mackal认为API的文本输出部分,如果有其他选项可用,不允许改变它。你不会看到格式的变化。 – 2010-02-06 21:51:49

0

应该有一些比单纯

[ `hg st |wc -l` -eq 0 ] && echo hi 
4

您也可以运行hg id。如果散列以+结尾,则表示工作副本已更改。这应该甚至适用于老版本的hg。

这听起来像你已经在使用zsh;好吧,几天前我帮助更新了内置的VCS_INFO的Mercurial支持,以便将VCS信息放入提示中。为下一个版本提供支持,以显示工作目录(除其他外)的更改。如果你不想等,你可以grab the necessary files from CVS

目前我的提示包括这(使用唯一内置的zsh功能):

(hg)[1801+ branchname somemq.patch, anycurrentbookmarks] 
+0

谢谢!这听起来像一个黑客,但实际上似乎是工作:)嗯。自从我上次看到CVS被使用以来已经有一段时间了;) – 2010-02-17 18:35:21

+0

如果您添加了一个未添加到存储库中的新文件,这不起作用 – etalon11 2018-02-12 09:57:43

2

我用:

hg status -m -a -r -d -u 

如果与被跟踪的文件没有变化,则命令输出一个空的字符串。

+0

Works good!我添加了参数“-u”来跟踪也属于未提交更改的未知文件。 – etalon11 2018-02-12 09:59:32

2

我现在用的这个庆典 - 摘录了一段时间:

if [[ $(hg status 2>/dev/null) ]] 
then 
    # do something 
fi 
+0

这是由未跟踪的文件触发的,也可能不是您想要的。 – xixixao 2016-01-24 03:01:21

1

两个idsummarystatus慢,所以这是我目前知道的最快方式,而忽略未跟踪文件:

[[ -z `hg status | grep -v '^?'` ]] && echo no-changes || echo has-changes