2013-03-18 24 views
40

Khi tôi chạy git ls-remote trong cây công việc, lệnh sẽ xuất ra một danh sách các bản sửa đổi trong repo gốc. Đối với một số lý do tôi nhận được 2 bản sửa đổi với tất cả các thẻ và cho phiên bản thứ hai của cùng một thẻ tên thẻ bao gồm ^{}Khi liệt kê git-ls-remote tại sao có "^ {}" sau tên thẻ?

git ls-remote 
From [email protected]:andris9/zzzzzz.git 
d69e66d7c915b9682618b7f304b80cc0ae4c7809 HEAD 
.... 
bb944682f7f65272137de74ed18605e49257356c refs/tags/v0.1.6 
771a930dc0ba86769d6862bc4dc100acc50170fa refs/tags/v0.1.6^{} 
a72251d945353a360087eb78ee75287c38a1c0e6 refs/tags/v0.1.7 
d69e66d7c915b9682618b7f304b80cc0ae4c7809 refs/tags/v0.1.7^{} 

tôi có thể tạo thẻ với

git tag -a v0.1.8 -m "tag message" 
git push --tags 

Từ ví dụ về git-ls-remoteman page có không có thẻ trùng lặp như vậy, vì vậy có lẽ tôi đang làm điều gì sai?

Trả lời

68

Có 2 loại thẻ - lightweightannotated. Thẻ trọng lượng nhẹ chỉ đơn thuần là refs trỏ đến một số đối tượng trong khi thẻ được chú thích là một đối tượng git riêng biệt và lưu trữ nhiều thông tin hơn như tác giả, người nhận, thông báo cam kết, v.v.

Khi bạn sử dụng git tag -a để tạo thẻ , git đã tạo thẻ chú thích cho bạn.

^{} là cú pháp được sử dụng để dereference thẻ. Nó được mô tả trong gitrevisions.

  • Khi được sử dụng với đối tượng thẻ, git sẽ đệ quy đệ quy lại thẻ cho đến khi tìm thấy đối tượng không phải thẻ.

  • Khi được sử dụng với các đối tượng phi tag, nó không làm bất cứ điều gì và tương đương với bỏ qua ^{}

Các refs/tags/v0.1.6 ref tại các điểm kho của bạn đến đối tượng thẻ bb944682f7f65272137de74ed18605e49257356c, mà tại các điểm lần lượt đến 771a930dc0ba86769d6862bc4dc100acc50170fa (đối tượng không phải thẻ) mà tôi đoán đang lưu trữ thông tin cam kết khi bạn tạo thẻ.

Vì vậy, khi bạn thực hiện refs/tags/v0.1.6^{}, git sẽ bỏ qua thẻ và giải quyết thẻ thành 771a930dc0ba86769d6862bc4dc100acc50170fa - đối tượng không gắn thẻ.

Ngoài ra còn có một lệnh git show-ref có thể được sử dụng để chỉ liệt kê các thẻ, và dereference tùy chọn như sau, và trong trường hợp của bạn nên cho kết quả sau:

$ git show-ref --tags 
bb944682f7f65272137de74ed18605e49257356c refs/tags/v0.1.6 
a72251d945353a360087eb78ee75287c38a1c0e6 refs/tags/v0.1.7 

$ git show-ref --tags --dereference 
bb944682f7f65272137de74ed18605e49257356c refs/tags/v0.1.6 
771a930dc0ba86769d6862bc4dc100acc50170fa refs/tags/v0.1.6^{} 
a72251d945353a360087eb78ee75287c38a1c0e6 refs/tags/v0.1.7 
d69e66d7c915b9682618b7f304b80cc0ae4c7809 refs/tags/v0.1.7^{} 

Để khẳng định điều này, bạn có thể sử dụng git show lệnh để cung cấp cho bạn thêm chi tiết về đối tượng git.

Đây là thông tin từ một trong các kho lưu trữ git thử nghiệm của tôi.

$ git show 43f9a98886ba873c0468c608f24c408b9991414f 
tag v0.1 
Tagger: Ash <[email protected]> 
Date: Sun Jul 15 00:14:43 2012 -0700 

Tagging Stable repo 0.1 :) 
-----BEGIN PGP SIGNATURE----- 
<PGP-SIGNATURE> 
-----END PGP SIGNATURE----- 

commit e55df25f2321a6b2c9a02fa80ccba7cbe3c38c08 
Merge: 796efcd 58e3a4d 
Author: Ash <[email protected]> 
Date: Sun Jul 15 00:02:44 2012 -0700 

    Merge branch 'dev' into 'master' for stable 0.1. 

$ git show e55df25f2321a6b2c9a02fa80ccba7cbe3c38c08 
commit e55df25f2321a6b2c9a02fa80ccba7cbe3c38c08 
Merge: 796efcd 58e3a4d 
Author: Ash <[email protected]> 
Date: Sun Jul 15 00:02:44 2012 -0700 

    Merge branch 'dev' into 'master' for stable 0.1. 
+0

Giải thích tuyệt vời, cảm ơn rất nhiều! – Andris

+2

Giải thích này tốt hơn lời giải thích trong câu hỏi trùng lặp! – pedromanoel

Các vấn đề liên quan