【发布时间】:2015-11-12 18:19:05
【问题描述】:
如果你这样做:git describe --long
你会得到:0.3.1-15-g3b885c5
这就是上面字符串的意思:
Tag-CommitDistance-CommitId (http://git-scm.com/docs/git-describe)
如何拆分字符串以获得第一个 (Tag) 和最后一个 (CommitId) 元素?
【问题讨论】:
如果你这样做:git describe --long
你会得到:0.3.1-15-g3b885c5
这就是上面字符串的意思:
Tag-CommitDistance-CommitId (http://git-scm.com/docs/git-describe)
如何拆分字符串以获得第一个 (Tag) 和最后一个 (CommitId) 元素?
【问题讨论】:
通过使用 String.split() 和 count 参数来管理 commitid 中的破折号:
$x = "0.3.1-15-g3b885c5"
$tag = $x.split("-",3)[0]
$commitid = $x.split("-",3)[-1]
【讨论】:
$a,$b = "0.3.1-15-g3b885c5".split('-')[0,2]
-1 来获取最后一个索引。
split() 与正则表达式没有任何问题。我喜欢正则表达式,但有时一个不太“复杂”的解决方案对未来的可读性和维护更好——原作者可能很好地理解正则表达式,但下一个支持脚本的人可能不会。对于更多涉及的文本解析和处理,我使用正则表达式 - 但对于像这样的简单拆分,我坚持使用 split()
注意:此答案侧重于改进 Richard's helpful answer 的 split-into-tokens-by-- 方法,但请注意该方法 不完全健壮,因为git 标签名称本身可能包含- 字符,因此您不能盲目假设第一个- 实例结束标签名称。
考虑到这一点,请改用Richard's robust solution。
只是为了提供更符合 PowerShell 习惯的变体:
# Stores '0.3.1' in $tag, and 'g3b885c5' in $commitId
$tag, $commitId = ('0.3.1-15-g3b885c5' -split '-')[0, -1]
PowerShell 的-split operator 用于通过分隔符- 将输入字符串拆分为令牌数组
虽然[string] 类型的.Split() 方法 在这里就足够了,但-split offers many advantages in general。
[0, -1] 从-split 返回的数组中提取第一个 (0) 和最后一个 (-1) 元素,并将它们作为 2 元素数组返回。
$tag, $commitId = 是一个解构多重赋值,它将生成的 2 元素数组的元素分别分配给一个变量。
【讨论】:
我不记得标签中是否允许使用破折号,所以我假设它们是,但不会出现在最后两个字段中。
因此:
if ("0.3.1-15-g3b885c5" -match '(.*)-\d+-([^-]+)') {
$tag = $Matches[1];
$commitId = $Matches[2]
}
【讨论】:
git check-ref-format --allow-onelevel '0.3.1-pre.1'; $LASTEXITCODE -eq 0