如何从Powershell中获取最新的Mercurial标签

时间:2011-05-30 21:11:56

标签: powershell mercurial

如果我从DOS提示符运行以下命令:

hg parent --template {latesttag}

然后我按预期返回最新的标记值。但是,如果我从powershell控制台中运行相同的命令,我会收到以下错误:

hg parent:选项-i无法识别

我需要在powershell中运行命令,因此我可以将结果作为要使用的变量。知道我需要做什么来运行命令吗?

2 个答案:

答案 0 :(得分:4)

你应该只需要在引号中包含--template的参数,以便Powershell知道它是一个字符串:

hg parents --template '{latesttag}'

然而,有时,通过Powershell解析事物的方式,您必须确保双引号存活(例如传递包含空格的参数,但应该是1个参数而不是许多,如路径或更长的模板):

hg parents --template '"{latesttag}"'

答案 1 :(得分:1)

这个答案带有一个巨大的免责声明:

  
      
  1. 可能有更好/不同的方式,只利用PowerShell代码,但我不是PowerShell专家
  2.   
  3. 我是以下类库的作者
  4.   

我创建了一个.NET类库Mercurial.Net,允许.NET程序环绕hg命令行客户端,而不必处理完成所有这些操作的所有复杂问题,等待程序完成等等。注意:您需要安装Mercurial,并且可以通过PATH使类库工作。

可以通过Nuget package安装。

由于我不是PowerShell专家,我将展示如何使用C#代码和我的库。

考虑到库没有实现所有选项(遗憾的是),遗憾的是我的库不能使用parents命令,但是log命令可以,尽管它可能会有更多的开销。你必须判断这是否可以接受。

不能使用parents命令的原因是我现在决定不在Mercurial中实现对模板语法的支持,因为那时我知道期望什么样的输出并且可以将它解析回正确的.NET实例

这是可以找到最尖端标记的.NET代码:

var repo = new Repository(".");
var tags = repo.Log(new LogCommand().WithRevision("tag()")).First().Tags.ToArray();

这将使用一组标记名称填充tags。 log命令以相反的顺序返回日志,首先返回最新的变更集,因此.First()将找到最新的变更集。

如果你需要最近的标签,它也是当前工作文件夹的祖先,这里是改变的代码:

repo.Log(new LogCommand().WithRevision("tag() and ancestors(.)")).First().Tags...
                                             ^---------------^

这包括工作文件夹的修订版(如果有标签)。如果您需要祖先,不包括工作文件夹的修订版:

repo.Log(new LogCommand().WithRevision("tag() and ancestors(.) and not .")).First().Tags...
                                                              ^--------^