2010-10-05 50 views
28

我需要Git命令到獲取/查找最後一個標籤'v'獲得最後版本提交(我在開始時使用v字母標記標記下一個應用程序版本(例如:v0.9.1beta如何獲得最後一個Git標籤匹配正則表達式標準

有沒有辦法做到這一點

+1

可你只需要使用'混帳describe'? – Daenyth 2010-10-05 21:07:01

+0

是的.. git describe --match v *是我需要的。謝謝。 – Lukasz 2010-10-05 21:16:05

+1

有人可以編輯標題,因爲這是不需要真正使用正則表達式。所有的答案都只是使用匹配和「glob」模式。謝謝。 – d4Rk 2014-11-28 13:57:05

回答

39

我使用下面的命令爲這個:?

git describe --match "v[0-9]*" --abbrev=4 HEAD 

如果自上次版本化標記以來您對源代碼樹執行了某些操作,它也將修改版本。

請注意,這是而不是正則表達式,但一個glob,但適用於提供的示例。

+2

如果您只想使用「--abbrev = 0」的標籤,使用「short output」。 – 2013-08-17 02:11:44

+3

['git describe' doc](https://git-scm.com/docs/git-describe)表示'--match'採用了glob,而不是正則表達式。 – 2016-10-28 04:51:49

+0

@CraigMcQueen是一個glob,這就是爲什麼它工作並過濾掉'v1.0.0'而不是'v1234'。我添加了一個註釋來澄清這一點。 – 2016-10-28 07:36:36

4
git tag -l -n v* 
+2

它列出了所有標籤匹配條件。我只需要最後一個,所以git描述--match v *。無論如何感謝提示標籤和描述命令鏈接在一起的git手冊頁。 – Lukasz 2010-10-05 21:17:47

2
git describe --match v* 

使用此。

+1

這將包括所有以'v'開頭的標籤,所以它會列出所有字不只是版本 – 2010-10-05 21:21:24

+0

是的......這是真的。無論如何,我標記你的正則表達式是解決我的問題。我應該刪除這個答案嗎? – Lukasz 2010-10-06 00:21:52

+0

感謝您的接受!不,我認爲不需要刪除這個答案。 – 2010-10-06 08:42:33

0

我使用

git tag -l --format "%(objecttype) %(refname:short)" --sort=-version:refname --merged HEAD "v*" 

git tag解釋圖案作爲水珠。所以你不能指定一個完整的正則表達式。只需使用最小glob(v *)甚至不使用glob。您將以排序順序(最高標記版本優先)獲得多於一個匹配標記,然後您將能夠將輸出與之後的表達式進行正則表達式匹配。

3

KARASZI István's answer已經解釋瞭如何找到與glob匹配的標籤,這通常足夠好。如果你曾經需要雖然是真正的正則表達式:

for tag in $(git tag | grep YOURREGEX); do 
    git describe --tags --long --match="$tag" 2>/dev/null 
done | sort -k2 -t"-" | head -n1 
  • 如果你只是想最近的標籤(即什麼--abrev=0將實現),追加| cut -d"-" -f1
  • 如果你不想--long的行爲也輸出,確切地說匹配標籤包括-0-hash部分,而是附加| sed -e's/-0-.*$//'

問題的示例標籤可能會使用正則表達式^v\d+\.\d+\.\d+\D*$(儘管\D*$可能是可選的)。

+0

...雖然這在性能方面明顯更差,因爲'git describe'是爲匹配RegEx的_each_標籤運行的。 – 2017-02-09 08:22:33

+0

感謝這:) – 2017-02-27 18:42:38

2

雖然單個正則表達式--match "v[0-9]*"就夠這裏,知道了Git 2.13(Q2 2017)將改善是:

git describe」和「git name-rev」已經被教導要花費超過一個refname模式限制這組參考文件將其 命名輸出作爲基礎,並且還學會了將 的負模式用於名稱,因爲名稱不適用於通過它們的「--exclude」選項進行命名。

通過Jacob Keller (jacob-keller)參見commit 77d21f2commit 43f8080commit 96415b4commit 290be66commit 4a68748(2017年1月18日)。
(在commit 1b32498Junio C Hamano -- gitster --合併,2017年2月27日)

你現在可以有multiple match pattern

--match <pattern>: 

只考慮標籤匹配給定glob(7)模式,不包括「裁判/標籤/ 「 字首。
這可以用來避免從存儲庫泄漏專用標籤。

如果給定多次,模式列表將被累積,並且將考慮匹配任何模式的標籤。
使用--no-match清除並重置模式列表。

而且你還有一個exclude pattern (or several) now

--exclude <pattern>:: 

不考慮標籤匹配給定glob(7)模式,不包括 的 「裁判/標籤/」 前綴。

這可用於縮小標籤空間並僅查找符合某些有意義標準的標籤。
如果給定多次,模式列表將被累計,並且匹配任何模式的標籤將被排除。
當與--match結合使用時,當至少匹配一個--match圖案並且不匹配任何--exclude圖案時,將會考慮標籤。使用--no-exclude清除並重置模式列表。

1

使用git describe爲其他答案的問題做是git describe會告訴你,是從頭部到達標籤(或提交指定。)

想象一下,你有3個標籤,V1,V2,和v3。如果HEAD位於v2和v3之間,則git describe將返回v2而不是v3。

如果您確實需要最新的標籤,首先您需要帶註釋的標籤,因爲輕量級標籤沒有日期元數據。

然後,此命令將做到這一點:

git for-each-ref --sort=-taggerdate --count=1 refs/tags/v*

相關問題