[英]Using Git describe without tags
我有一個存儲庫,當我運行git describe
時,它只給我一個哈希值。 直到今天我才知道它這樣做是因為--always
選項(這是我正在使用的),因為該存儲庫沒有標簽。 我有另一個包含很多標簽的存儲庫。
我如何使用git describe
來排除標簽並只給我一個哈希值? 我想要git describe
的所有其他功能,以防我需要使用其他功能,例如臟標記; 我只想排除標簽。 這是可能的,還是標簽是describe
的核心特征?
幫助頁面似乎確實表明了這一點,但我只是想確定一下。 我在 Ant build.xml 文件中使用它,所以我盡量保持簡單。
一種簡單的方法是將--always
與-exclude
選項結合使用,使用*
的 glob 模式,以排除所有標記。 因為它找不到任何未排除的標簽,describe 將退回到縮寫的 sha1 加上可選的“-dirty”等。
$ git describe --always --dirty --abbrev=5
2018.02-rc1-58-gca0e6
$ git describe --always --dirty --abbrev=5 --exclude '*'
ca0e6
是的,但這不一定是個好主意。 有一個--all
選項,它將搜索分支名稱——或者實際上,所有引用——以及,但如果你使用它,你可能還需要--long
。
git describe
輸出的核心特征是它以(或應該)人類可讀的名稱開頭:
v1.2.3
為此,如有必要,Git 將添加一個后綴,指示當前(或請求的)提交與此字符串所命名的不完全相同。 后綴告訴你和 Git 偏離標簽的程度。 如果沒有后綴,則標記本身會命名提交。 因為標簽從不移動,如果我們有那個名字,我們保證2使用那個名字找到正確的提交。
使用沒有標簽且沒有--always
的存儲庫:
$ git describe
fatal: No names found, cannot describe anything.
但是,如果我們添加--all
,我們可能會得到:
$ git describe --all
heads/master
這是一個人類可讀的名稱,但它有一個問題:它不能唯一地標識一個特定的提交,因為分支名稱會移動。 一旦我在此存儲庫中進行了新的提交, refs/heads/master
現在會命名一個不同的提交。
由於來自git describe
的這些輸出之一的通常意圖是提供一個人類可讀但准確指定提交的 ID,因此分支名稱從來都不是那么准確,不一定是一件好事。
您可以添加--long
:
$ git describe --all --long
heads/master-0-g2cbd83f
這現在使用-g...
后綴來指定實際哈希 ID 的前綴。 現在 Git 可以驗證master
本身沒有移動,或者如果移動了,您可以使用2cbd83f
字符串來查找提交。
1嗯,幾乎沒有。 請參閱git-tag
文檔,了解何時、為何以及為何不移動標簽。
2無論如何,保證標簽沒有移動。
由於來自
git describe
的這些輸出之一的通常意圖是提供一個人類可讀但准確指定提交的 ID
根據 Git 2.20,這就是官方git describe --long
必須做的
請參閱Frederick Eaton (``)的提交 55f6bce 、 提交 6271d94 、 提交 c263279 (2018 年 9 月 19 日)。
(由Junio C Hamano 合並gitster
提交 fb468f0,2018年 10 月 16 日)
git-describe.1
:闡明“人類可讀”也是 git 可讀的標題使用術語“人類可讀”,但描述並未在上下文中對此進行解釋。
手冊頁現在包括:
結果是一個“人類可讀”的對象名稱,它也可以用來識別對其他 git 命令的提交。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.