2016-12-04 44 views

回答

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.1v2.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/* 

(做,在臨時克隆第一...)

+0

謝謝!看起來非常好。我只有一個錯誤:cd:!$:沒有這樣的文件或目錄。 – crisscross

+0

'!$'是歷史擴展語法,如果您的shell沒有打開,請鍵入上一個命令行的最後一個參數,而不是''scratch'' – jthill

+0

對不起,仍然無法正常工作。我把所有的行放在一個bash文件中並且致命:不是有效的對象名稱。似乎所有的作品,直到git描述s。我試圖更多地瞭解-s選項,但我無法解決它。 – crisscross

0

也許是你想要什麼 -

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 
+0

這是正確的的想法,但在很多情況下會給出錯誤的結果。你能解決一些嗎? – jthill

+0

@jthill我添加了示例輸出。你能給我舉個例子,說明哪些情況顯示錯誤的輸出,那我可以檢查一下嗎? –

+0

謝謝,但是輸出給我的所有分支都帶有最新的標籤(未編號),包括甚至沒有標籤的分支。我發現我可以使用喜歡 - 匹配2. *。但是這個列表對我來說仍然是錯誤的。 – crisscross

相關問題