Các thẻ git có được đẩy là tốt?


188

Vì tôi đã tạo kho lưu trữ của mình nên có vẻ như các thẻ tôi đang tạo không được đẩy vào kho lưu trữ. Khi tôi thực hiện git tagtrên thư mục cục bộ, tất cả các thẻ đều có mặt, nhưng khi tôi đăng nhập vào kho lưu trữ từ xa và thực hiện git tag, chỉ một vài cái đầu tiên xuất hiện.

Vấn đề có thể là gì?.


3
git push --follow-tagsbây giờ có thể hữu ích, xem câu trả lời của tôi dưới đây
VonC


1
Đồng ý với bản sao: mặc dù cái này cũ hơn, nhưng câu hỏi khác được đặt ra tốt hơn.
Ciro Santilli 郝海东 冠状 病 事件

Câu trả lời:


244

Bạn có thể làm điều này:

git push --tags

27
Tôi khá chắc chắn rằng điều đó có nghĩa là các giới thiệu CHÍNH sẽ không bị đẩy, nghĩa là bạn CHỈ đẩy các thẻ.
Dan Rosenstark

47
"Tôi khuyên bạn không nên sử dụng hoặc đào tạo người khác sử dụng git push --tagsvì việc loại bỏ các thẻ xấu có thể rất khó khăn khi đồng nghiệp của bạn được đào tạo để đẩy tất cả các thẻ, vì mọi người tiếp tục đẩy các thẻ xấu cũ mà họ có tại địa phương mỗi khi họ muốn đẩy một thẻ mới. Vì điều này, tôi sẽ chỉ khuyên mọi người sử dụng git push origin <tag_name>ngay bây giờ. " - được sao chép từ stackoverflow.com/a/5195913/4130619
giảm hoạt động

Tôi nghĩ rằng câu trả lời khác, stackoverflow.com/a/16164809/11635 nên được chấp nhận. Ngay cả nếu không, nó chắc chắn nên được đọc - nó cung cấp ưu và nhược điểm và cuối cùng là một câu trả lời thực tế và đúng đắn hơn cho ngày hôm nay
Ruben Bartelink

138

Trong cấu hình từ xa git mặc định, bạn phải đẩy các thẻ một cách rõ ràng (trong khi chúng được tìm nạp tự động cùng với các xác nhận mà chúng trỏ đến). Bạn cần sử dụng

$ git push <remote> tag <tagname>

để đẩy một thẻ, hoặc

$ git push <remote> --tags

để đẩy tất cả các thẻ (hoặc git push --tagsđể đẩy đến điều khiển từ xa mặc định, thường origin).

Đây là hành vi rất nhiều dự định, để làm cho các thẻ đẩy rõ ràng. Đẩy thẻ nên thường là sự lựa chọn có ý thức.


Tóm tắt những gì Junio ​​C. Hamano đã viết (được liên kết trong các bình luận của @Andre Miras)

Khi tìm nạp, bạn đang tương tác với một kho lưu trữ từ xa mà ai đó đã xuất bản, có nghĩa là:

  1. bộ thẻ tồn tại có tất cả các nhà xuất bản muốn mọi người nhìn thấy, và
  2. không chỉ bạn mà những người khác cũng sẽ thấy các thẻ tương tự.

Nói cách khác, các thẻ trong kho lưu trữ mà bạn tìm nạp được thiết kế để công khai và chia sẻ. Nó sẽ tạo điều kiện giao tiếp giữa các nhà phát triển nếu mọi người dễ dàng tìm nạp các thẻ này.

Đó là lý do tại sao git fetchtự động "theo dõi" các thẻ, tức là nó tải xuống các thẻ khi tải xuống các bản sửa đổi mà chúng trỏ đến - nói cách khác là tải xuống tất cả các thẻ được xuất bản có liên quan .

Khi đẩy, bạn đang đẩy từ kho lưu trữ làm việc của mình, phần lớn thời gian không công khai và các thẻ trong kho lưu trữ đó không được thiết kế để công khai. Bạn có thể sử dụng các thẻ cục bộ của riêng mình để đánh dấu tiến trình của mình, vì vậy sẽ không có ý nghĩa khi đẩy tất cả các thẻ trong kho lưu trữ của bạn vào kho lưu trữ mà bạn đang đẩy để xuất bản các thay đổi của mình, theo định nghĩa công khai.

Đó là lý do tại sao bạn cần đẩy thẻ rõ ràng, để đánh dấu thẻ là công khai.


Ngoài ra, bạn có thể định cấu hình điều khiển từ xa mà bạn đẩy để luôn đẩy tất cả các thẻ, ví dụ: đặt một cái gì đó giống như vậy vào .git/config:

[từ xa "xuất bản"] # hoặc bất cứ thứ gì nó được đặt tên
    url = ...
    đẩy = + refs / Heads / *: refs / Heads / *
    đẩy = + refs / tags / *: refs / tags / *

Điều này có nghĩa là lực đẩy tất cả các đầu (tất cả các nhánh) và tất cả các thẻ (nếu bạn không muốn đẩy đầu, hãy loại bỏ tiền tố '+' khỏi refspec).


Không phải điều này luôn luôn làm một 'lực đẩy' của tất cả các đầu sao?
Stefan Näwe

@Stefan: Có. Cập nhật.
Jakub Narębski

19
"Đây là hành vi rất có chủ đích, để làm cho các thẻ đẩy rõ ràng. Các thẻ đẩy thường là lựa chọn có ý thức." Tôi không hiểu lý do. Bạn có thể giải thích lý do tại sao Git sẽ tự động đẩy thẻ không?
Ryan Lundy

13
@Kyralessa, trong bài đăng này git.661346.n2.nabble.com/,, Junio ​​C Hamano (người duy trì hiện tại của Git) giải thích lý do tại sao việc tự động đẩy thẻ là một điều xấu.
Andre Miras

@AndreMiras Cảm ơn bạn vì liên kết tuyệt vời này. Sẽ thật tuyệt nếu chúng ta có thể tích hợp bài viết của Junio ​​vào câu trả lời này.
Homer6

67

Lưu ý rằng kể từ git 1.8.3 (ngày 22 tháng 4 năm 2013) , bạn không còn phải thực hiện 2 lệnh để đẩy các nhánh và sau đó để đẩy các thẻ:

--follow-tagsTùy chọn " " mới nói " git push" để đẩy các thẻ chú thích có liên quan khi đẩy các nhánh ra .

Bây giờ bạn có thể thử, khi đẩy các cam kết mới:

git push --follow-tags

Tuy nhiên, điều đó sẽ không đẩy tất cả các thẻ cục bộ, chỉ những thẻ được chú thích được tham chiếu bởi các xác nhận được đẩy bằng git push.


Điều này đã được giới thiệu trong cam kết c2aba15 bởi Junio ​​C Hamano ( gitster) :

Tùy chọn mới " --follow-tags" nói " git push" để đẩy các thẻ chú thích bị thiếu từ phía bên kia và có thể đạt được bởi lịch sử bị đẩy ra ngoài.

Ví dụ: nếu bạn đang sử dụng cú đẩy " simple", " current" hoặc " upstream", bạn thường sẽ đẩy lịch sử dẫn đến cam kết hiện tại HEADvà không có gì khác.
Với tùy chọn này, bạn cũng sẽ đẩy tất cả các thẻ chú thích có thể đạt được từ cam kết đó sang phía bên kia.


Cấu hình push.followTagscho phép bao gồm --follow-tagstheo mặc định (Git 2.4.1+, Q2 2015). Xem " Đẩy git cam kết & thẻ đồng thời "


3
Điều này chỉ đẩy tất cả các thẻ chú thích . Hầu hết mọi người / dự án đang sử dụng các thẻ nhẹ . Vì vậy, trong hầu hết các trường hợp git push --follow-tagskhông đẩy nhiều hơngit push
Jarl

3
@Jarl có, tôi đã đề cập đến "chú thích" trong câu trả lời của tôi. Nhưng tôi thực sự chỉ sử dụng các thẻ chú thích, dự trữ các thẻ nhẹ để sử dụng hoàn toàn nội bộ (nghĩa là không bao giờ có nghĩa là phải đẩy).
VonC

@VonC: Bây giờ cũng có một tùy chọn cấu hình làm cho nó mặc định, như bạn đã lưu ý ở đây: stackoverflow.com/a/3745250/946850
krlmlr

19

Những gì tôi thường làm là:

[từ xa "xuất bản"] # hoặc bất cứ thứ gì nó được đặt tên
    url = ...
    đẩy =:
    đẩy = + refs / tags / *: refs / tags / *

Có nghĩa là nó đẩy mọi chi nhánh đã có sẵn, cộng với các thẻ. Nó không ép buộc, và nó không đẩy chi nhánh mà bạn không đẩy bằng tay.


Tôi cũng có thể đặt nó trong cấu hình git toàn cầu của người dùng của mình không? Nếu có, làm thế nào? Cảm ơn! :)
gucki

Có vẻ như bạn đang buộc các thẻ, nhưng không phải các chi nhánh.
Adrian Ratnapala

Vâng, vâng, và không, tôi đã viết rằng, nó sẽ đẩy các thẻ mới, nó sẽ không đẩy chúng, và nó sẽ không đẩy các nhánh mà bạn chưa tự đẩy mình.
chiếu

Tôi đã thử đề xuất của Jakub, nhưng nó đã đẩy các chi nhánh mà tôi chỉ muốn tại địa phương. Đề nghị này, mat, hoạt động hoàn hảo. Nó đồng bộ hóa các thẻ nhưng không đồng bộ hóa các nhánh trừ khi chúng là các nhánh theo dõi từ xa (nghĩa là nó sẽ không đẩy các nhánh mới vào điều khiển từ xa, nhưng sẽ cập nhật chúng nếu chúng đã ở trong điều khiển từ xa). LƯU Ý: nếu bạn có thẻ và chi nhánh có cùng tên bạn sẽ gặp lỗi "khớp nhiều hơn một". Tham khảo Lostechies.com/jasonmeridth/2010/02/27/refspec-matches-more-than-one/ .
josephdpurcell

5

Và nếu bạn muốn bắt buộc tìm nạp tất cả các thẻ, bạn có thể đặt nó trong cấu hình bằng cách:

git config remote.origin.tagopt --tags

Từ các tài liệu:

Đặt giá trị này thành --no-tags sẽ vô hiệu hóa thẻ tự động theo sau khi tìm nạp từ xa. Đặt nó thành --tags sẽ tìm nạp mọi thẻ từ xa, ngay cả khi chúng không thể truy cập được từ các đầu chi nhánh từ xa. Truyền trực tiếp các cờ này cho git-fetch (1) có thể ghi đè cài đặt này. Xem các tùy chọn --tags và --no-tags của git-fetch (1).


1
Câu hỏi được định hướng 'đẩy' hơn, câu trả lời của bạn cũng được áp dụng khi đẩy vào điều khiển từ xa phải không?
a1an
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.