2011-04-03 57 views
1

嗨相同的格式提交列表的標籤,我想列表標籤像它的上市:在如git的分支-v

# git branch -v 
* devel e7f5e36 firxed bugs 
    master 63e9c56 remove unused code 

無*(你無法檢出標籤)。

最好有一個選項來列出完整或短的SHA1。一個bash腳本也很好,但是更好地使用git命令並且減少shell腳本將會很好。

我讀過這個問題How to tell which commit a tag points to in Git?它幫助了我,但它不是我想要的。

編輯:

我不知道帶註釋的標籤有SHA1。我希望標籤指向的提交SHA1,而不是標籤本身。

+1

在['git-for-each-ref'手冊頁中有一個*瘋狂*詳細的例子(http://www.kernel.org/pub/software/scm/git/docs/git-for- each-ref.html) - 大幅減少它會做你想要的。當我有機會時,我會爲你寫點東西。 – Cascabel 2011-04-03 14:22:41

+0

我會檢查它。謝謝 – NickSoft 2011-04-03 14:41:05

回答

3

更新刪除舊的東西,更新與格式

最簡單混帳瓷方式來獲得最信息:

git show-ref --tags --abbrev 

(鬆--abbrev完全SHA1)

完整的鐘聲和哨聲:

git for-each-ref --format="%(refname) %(objectname) %(subject)" | 
     grep /tags/ | 
     sed 's#^refs/tags/##' 

典型輸出:

tag1 b93d2f5e5ad52b8abbee9f5ca8435a1d271ddbb6 test 
tag2 b93d2f5e5ad52b8abbee9f5ca8435a1d271ddbb6 test 
tag3 58b05fd27be9484bf981752e89843bee7aff8860 test2 
tag4 b1be7e4de8949b7ba515e4cad5d214dc71d9b6d2 annotated 
tag5 779528366646eeef1d87d30fa3d76c70d0493dff and signed 

要克隆我的測試回購:

base64 -d <<HERE > /tmp/so5529735.bundle 
IyB2MiBnaXQgYnVuZGxlCjU4YjA1ZmQyN2JlOTQ4NGJmOTgxNzUyZTg5ODQzYmVlN2FmZjg4NjAg 
cmVmcy9yZW1vdGVzL3EvbWFzdGVyCmI5M2QyZjVlNWFkNTJiOGFiYmVlOWY1Y2E4NDM1YTFkMjcx 
ZGRiYjYgcmVmcy90YWdzL3RhZzEKYjkzZDJmNWU1YWQ1MmI4YWJiZWU5ZjVjYTg0MzVhMWQyNzFk 
ZGJiNiByZWZzL3RhZ3MvdGFnMgo1OGIwNWZkMjdiZTk0ODRiZjk4MTc1MmU4OTg0M2JlZTdhZmY4 
ODYwIHJlZnMvdGFncy90YWczCmIxYmU3ZTRkZTg5NDliN2JhNTE1ZTRjYWQ1ZDIxNGRjNzFkOWI2 
ZDIgcmVmcy90YWdzL3RhZzQKNzc5NTI4MzY2NjQ2ZWVlZjFkODdkMzBmYTNkNzZjNzBkMDQ5M2Rm 
ZiByZWZzL3RhZ3MvdGFnNQoKUEFDSwAAAAIAAAAFkA14nJXLTQrCMBBA4X1Okb1QkslPJyDiHTzB 
TDKhom0lHe+vHsHl4+PpELGREVKrOULlLFzIZScpcseWCyB2FonFRfOiIZtaLqFBT5KoJWAk/nrp 
qRLGkMg3mH1rzNnQW5d92JvoYs+HLHJdRcaDdPrFtD0v1gfnMXossz05cM7UfV3vqvLnZlQOBfMB 
6ao+qP0BWLBf0nvpSEv5gXUuiYQ77nr/iGB4nLvAOJ9xgt7EOB1Gg4ndZnwGCtoGRgYGXFwlqcUl 
XACDHwf3zyZ4nG2RyY6bQABE73wFx0RWzD5AlInSDBgwpt1gFsONpVlss8huYPDXz0xyTUklVdWt 
9Ib8ggtCS0rOSlXJyzlWRUXMK1XhZInHiqqIQo6xnFWVorywFFlHTBdD17WEIllNf1r6CjW+0ydM 
GvrXAzf4T4fx/ZqR7VfZ9rffNCewnCKKLKfSG5ZnWYrK+pJ+tHWPS+rHlzTDtCGNTESfbBOCIPSN 
vzsV4fujHfqftNlPyKRnbituOZb+ZsKQObT99P6dolrPKDQANFADU/P2sNsDAYBhbyDi9rLjg2aN 
dBxazMV4tqUjxTu0DBvyMEZ3SMPhSElwPHm7BCfMxAt9eucFPdfWYbWy+Sx7ADW924SDbBYEaZIo 
vncvnhlEzAqZdOIP6UwdiyjLVOFZx7qdPyopjgR9dVamBG+pn3zevzZJvp/LwkJ6EPHzYFku6f2z 
e5sbwVE96q7dKnfX+D5iSX4ictT6S9TZyN70kO3iBTnLyX9qMIxP0hzrI1TNxbkTG10DhXBaTuXJ 
beP6R/WZqLA5X4EWJ1HtgH6elrmU7d07M7pjnF4OTh2LTbCZF99FjHpA8lmrFWeiAAzS8+oYmfWm 
r4XUypdQzNZ0nRrleXzaFmzbvjimpCNGgJB2NMcODkDprpVZXiLvlXp1kWf9o2lA/X8sPwAX3sJy 
8gJ3lSg2Zkbu7x2H0w+j12xw0Ek9/3ice8/SwjjBmdFkoouWmLGlkamCtoGRgQEXV2JeXn5JYklq 
ChcAos4JUiB4nAMAAAAAATDs5z1PX9htU9L79152rIjAVSvV 
HERE 

git clone --mirror /tmp/so5529735.bundle /tmp/so5529735.git 

乾杯

+0

更新了示例 – sehe 2011-04-03 13:08:07

+0

這兩種解決方案都沒有顯示所有標籤。我認爲它只顯示帶註釋的標籤。如果使用awk進行格式化,則第二個有機會。我還需要有一個選項來顯示完整的SHA1 – NickSoft 2011-04-03 13:55:29

+0

我發現爲什麼標籤丟失。我對同一個提交有兩個標籤:'initial'和'v0.1.1'。只有其中一個正在顯示。 'initial'是未註釋的(沒有消息)。 'initial'顯示並且'v0.1.1'不是 – NickSoft 2011-04-03 14:38:11

2

結果的sehe的版本:SEH的

# git for-each-ref --format="%(refname) %(objectname) %(subject)" \ 
    | grep /tags/ |  sed 's#^refs/tags/##' 
initial a9dcc1f24cacde535523bddc22f4c69467428550 initial commit 
v0.1.1-alpha b784145a9a71478337f5ceae30aaac4e1b955ee5 initial version. big chance to work. not quite tested 
v0.1.2-alpha 193993aabb0c3634ebea0405ecd420e99c609422 it is still alpha 
v0.1.3-alpha 415fb8f25982233b1b1211d8500e923e40ce64fd works better. not tested in details. 

結果E公司的短輸出(如默認輸出的Git分支-v)版本:

# git for-each-ref --format="%(refname) %(objectname:short) %(subject)" \ 
    | grep /tags/ |  sed 's#^refs/tags/##' 
initial a9dcc1f initial commit 
v0.1.1-alpha b784145 initial version. big chance to work. not quite tested 
v0.1.2-alpha 193993a it is still alpha 
v0.1.3-alpha 415fb8f works better. not tested in details. 

我的版本的結果:

initial  a9dcc1f initial commit 
v0.1.1-alpha a9dcc1f initial version. big chance to work. not quite tested 
v0.1.2-alpha 8dd326d it is still alpha 
v0.1.3-alpha 54d7ccd works better. not tested in details. 

這裏初始是輕量級的標籤

差異:

  1. (最重要)第一列自動填充到最大標籤l ength - 更具可讀性
  2. SHA1承諾標籤指向即使它不是輕量級標籤。這樣你可以很容易地看到最初的指向與v0.1.1-alpha相同的提交。這種行爲很容易做到可選。

我的腳本太長。我只會發布git調用函數(bash腳本)。大部分是取自混帳的for-each-REF手冊頁:

function gitTags(){ 
    arg="$1" 
    REF=${arg:-"*"} 
    fmt=' 
    r=%(refname) 
    t=%(*objecttype) 
    T=${r#refs/tags/} 
    o=%(*objectname:short) 
    s=%(subject) 
    kind="T" 
    if [ "$t" = "" ] ; then 
     # could be a lightweight tag 
     t=%(objecttype) 
     kind="L" 
     o=%(objectname:short) 
    fi 
    len=${#T} 
    if [ "$len" -gt ${len1:-0} ]; then 
     len1=$len 
    fi 

    echo -e "$T\t$o\t$s" 
    ' 
    eval=`git for-each-ref --shell --format="$fmt" \ 
      --sort='*objecttype' --sort=taggerdate "refs/tags/$REF"` 

    out=`eval "$eval"'echo $len1;'` 
    local len1=`echo "$out"|tail -n 1` 

    echo "$out"|head -n -1 \ 
    |awk 'BEGIN{FS="\t"}{printf("%-'$len1's %s %s\n", $1, $2, $3)}' 

} 

用法:

#show all tags: 
gitTags 
#show all tags starting with v (v1.0) 
gitTags v* 
1

的OP說,他想提交的標記點的SHA1。當sehe和NickSoft給出的上述解決方案在標籤是註釋標籤時不會提交提交的SHA1。相反,他們給出指向註釋對象的SHA1。如果要列出每一個標籤和的提交SHA1(註釋對象指向提交)

,那麼你可以簡單地執行:

git log --tags --oneline --decorate=short 

不幸的是,這會不會給你格式類似於

git branch -v 

但是你可以來八九不離十通過執行:

git for-each-ref --format="%(refname:short)" refs/tags | 
    awk '{printf "%s ",$1; system("git rev-list --max-count=1 "$1)}' 

注意,git rev-list會給你提交的SHA1,但是git show-ref和git for-each-ref只給出被指向的對象的SHA1(在註釋標記的情況下是註釋對象不是提交)。