我有很多包含不同版本標籤的Git分支。我正在尋找解決方案,在那裏我逐行列出了所有分支機構和最新編號的標籤。 (版本具有始終相同的格式:XYZ)如何獲取包含Git中所有分支和最新標籤的列表?
實施例:
主:2.2.2
branchB:2.2.1
branchC:2.0.0
我有很多包含不同版本標籤的Git分支。我正在尋找解決方案,在那裏我逐行列出了所有分支機構和最新編號的標籤。 (版本具有始終相同的格式:XYZ)如何獲取包含Git中所有分支和最新標籤的列表?
實施例:
主:2.2.2
branchB:2.2.1
branchC:2.0.0
如果你沒有任何不想要的標籤亂丟垃圾最多的地方@ sajibkhan的得到了正確的理念,
git for-each-ref refs/heads refs/remotes --format='
printf '%s: ' %(refname:short); git describe --tags --abbrev=0 %(refname:short)
' |sh
或用更熟悉的while read
,
git branch -a|sed s/.//|while read branch; do
printf '%s: ' "$branch"; git describe --tags --abbrev=0 $branch
done
但你的
their latest numbered tag
讓我覺得你有一些標記,沒有編號,這些將使git describe
有時給錯誤的結果。
git describe
有--match
選項,所以如果你能煮了正賽的glob你要考慮,例如標籤如果--match=[0-9]*
將做到這一點,只需補充一點。但例如linux有像v4.8.1
和v2.6.3-rc7
這樣的標籤,並且僅僅匹配一個glob模式並不容易。
對於這樣的情況,有對裁判手術一個很好的技術:
scratch=`mktemp -d`
git clone -s --mirror . "$scratch"
cd !$
使得與重複的裁判,但沒有實際內容的真快刮克隆。 -s
是--shared
的簡稱,repo使用主對象db,鏡像克隆始終是裸露的,因此沒有簽出。使用共享對象克隆進行任何臨時性工作,如果您不確定是否需要結果,或者需要事先和之後的工作。
所以,現在你在沙盒鏡子的時候,你可以直接刪除裁判你不想在這裏看到:
git for-each-ref refs/tags/*[^0-9.]* --format='
delete %(refname)
' | git update-ref --stdin
刪除每一個具有非數字,或者點標籤以其名義在任何地方。
清理完畢的scratch-monkey refname空間已準備就緒,可以直接使用上面的git describe
s。
這是一個通用的技術:你可以把,把你想要的任何裁判,與URL或路徑名的任何地方,任何種類的重寫你想要的。這包括您當地的回購。這裏,例如,是使或快進當地的分支機構爲每個遠程跟蹤分支的殘忍的方式:
git fetch . refs/remotes/origin/*:refs/heads/*
(做,在臨時克隆第一...)
也許是你想要什麼 -
git branch -a | while read branch; do
echo "$branch"; git describe --tags --abbrev=0 $branch
done
它顯示all local & remote branches with latest tag
。
樣本輸出:
* master
0.3
branch-1
0.2.1
remotes/origin/master
0.3
這是正確的的想法,但在很多情況下會給出錯誤的結果。你能解決一些嗎? – jthill
@jthill我添加了示例輸出。你能給我舉個例子,說明哪些情況顯示錯誤的輸出,那我可以檢查一下嗎? –
謝謝,但是輸出給我的所有分支都帶有最新的標籤(未編號),包括甚至沒有標籤的分支。我發現我可以使用喜歡 - 匹配2. *。但是這個列表對我來說仍然是錯誤的。 – crisscross
謝謝!看起來非常好。我只有一個錯誤:cd:!$:沒有這樣的文件或目錄。 – crisscross
'!$'是歷史擴展語法,如果您的shell沒有打開,請鍵入上一個命令行的最後一個參數,而不是''scratch'' – jthill
對不起,仍然無法正常工作。我把所有的行放在一個bash文件中並且致命:不是有效的對象名稱。似乎所有的作品,直到git描述s。我試圖更多地瞭解-s選項,但我無法解決它。 – crisscross