Đẩy git cam kết & thẻ đồng thời


387

Tôi biết lý do đó git push --tagslà một hoạt động riêng biệt để cũ git push. Đẩy thẻ nên là một lựa chọn có ý thức vì bạn không muốn vô tình đẩy một thẻ. Tốt rồi. Nhưng có cách nào để đẩy cả hai lại với nhau? (Ngoài ra git push && git push --tags.)


4
Vấn đề của bạn là git push && git push --tagsgì?
fuz

21
Không có gì đặc biệt, nó chỉ chậm hơn vì kết nối phải được thiết lập hai lần.
Will Robertson

16
Xem câu trả lời cập nhật của tôi dưới đây: có một --follow-tagstùy chọn mới kể từ git 1.8.3
VonC

24
Một lý do khác để không thực hiện những điều này một cách riêng biệt, là để tránh kích hoạt hai bản dựng CI cho cùng một cam kết, khi bạn có loại tự động hóa đó.
Alex R

cũng --tagskhông phân biệt giữa nguồn
karlsebal

Câu trả lời:


555

Cập nhật tháng 5 năm 2015

Kể từ git 2.4.1 , bạn có thể làm

git config --global push.followTags true

Nếu được đặt thành true, bật tùy chọn --follow-tags theo mặc định.
Bạn có thể ghi đè cấu hình này tại thời điểm đẩy bằng cách chỉ định --no-follow-tags.

Như đã lưu ý trong chủ đề này bởi Matt Rogers trả lời Wes Hurd :

--follow-tags chỉ đẩy các thẻ chú thích .

git tag -a -m "I'm an annotation" <tagname>

Điều đó sẽ được đẩy (trái ngược với git tag <tagname>, một thẻ nhẹ, sẽ không bị đẩy, như tôi đã đề cập ở đây )

Cập nhật tháng 4 năm 2013

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ỉ một thẻ được tham chiếu bởi các cam kết được đẩy bằng git push.

Git 2.4.1+ (quý 2 năm 2015) sẽ giới thiệu tùy chọn push.followTags: xem " Cách tạo ra những cuốn git pushsách có thể bao gồm các thẻ trong một nhánh? ".

Câu trả lời gốc, tháng 9 năm 2010

Tùy chọn hạt nhân sẽ là git push --mirror, sẽ đẩy tất cả các ref theo refs/.

Bạn cũng có thể đẩy chỉ một thẻ với cam kết chi nhánh hiện tại của mình:

git push origin : v1.0.0 

Bạn có thể kết hợp --tagstùy chọn với một refspec như:

git push origin --tags :

(vì --tagscó nghĩa là: Tất cả các ref dưới refs/tagsđược đẩy, ngoài các refspec được liệt kê rõ ràng trên dòng lệnh )


Bạn cũng có mục này " Đẩy các nhánh và thẻ bằng một lệnh gọi " git đẩy "

Một mẹo hữu ích vừa được Zoltán Füzesi đăng lên danh sách gửi thư Git :

Tôi sử dụng .git/configđể giải quyết điều này:

[remote "origin"]
    url = ...
    fetch = +refs/heads/*:refs/remotes/origin/*
    push = +refs/heads/*
    push = +refs/tags/*

Với những dòng được thêm vào git push originsẽ tải lên tất cả các chi nhánh và thẻ của bạn. Nếu bạn chỉ muốn tải lên một số trong số họ, bạn có thể liệt kê chúng.

Chưa tự mình thử, nhưng có vẻ như nó có thể hữu ích cho đến khi một cách khác để đẩy các nhánh và thẻ cùng lúc được thêm vào git đẩy.
Mặt khác, tôi không ngại gõ:

$ git push && git push --tags

Coi chừng , như nhận xét của Aseem Kishore

push = +refs/heads/*sẽ đẩy tất cả các chi nhánh của bạn .

Điều này bit tôi chỉ bây giờ, vì vậy FYI.


René Scheibe thêm nhận xét thú vị này :

Các --follow-tagstham số được gây hiểu lầm chỉ khi thẻ dưới .git/refs/tagsđược xem xét.
Nếugit gc được chạy, các thẻ được chuyển từ .git/refs/tagssang .git/packed-refs. Sau đó git push --follow-tags ...không hoạt động như mong đợi nữa.


3
Một bình luận trên bài đăng bạn liên kết để chỉ ra một cách chính xác rằng lực lượngpush = +refs/heads/* dòng - làm sạch tất cả các chi nhánh của bạn. Điều này bit tôi chỉ bây giờ, vì vậy FYI.
Aseem Kishore

2
Re: --follow-tagscờ được thêm vào trong git 1.8.3, tôi có thể định cấu hình cài đặt git của mình để đặt mặc định đó không?
Trevor Burnham

1
@TrevorBurnham không, chỉ có giá trị push.default( git-scm.com/docs/git-config ) có thể xác định những hành động mặc định trên push ( nothing, matching, upstream, simplenhư trong stackoverflow.com/a/10002469/6309 ). Bạn cần thêm --follow-tagmột cách rõ ràng.
VonC

1
@VonC Nếu tôi muốn buộc đẩy thẻ thì sao? git push --follow-tags -fkhông làm việc cho tôi.
mauryat

1
Các --follow-tagstham số được gây hiểu lầm chỉ khi thẻ dưới .git/refs/tagsđược xem xét. Nếu git gcđược chạy, các thẻ được chuyển từ .git/refs/tagssang .git/packed-refs. Sau đó git push --follow-tags ...không hoạt động như mong đợi nữa.
René Scheibe

4

Có lẽ điều này giúp ai đó:

 1. git commit -a -m "msg"  
 2. git tag 0.1.0                // creates a new tag locally     
 3. git push origin tag 0.1.0    // pushes the tag & the code in the remote repo          

Tôi đã thử giải pháp của bạn với git-2.21.0.windows.1 và thấy rằng 3 thẻ chỉ đẩy
Dustin Sun

Nó hoạt động tốt ở cuối của tôi. Bạn đang thử tất cả 3 lệnh theo đúng thứ tự và repo từ xa được đặt (git remote -v)?
Rajesh Gupta

Tôi đã sử dụng "git commit -m" tin nhắn "trong bước 1 và không có tham số -a. Đây có thể là lý do. Cảm ơn bạn đã theo dõi!
Dustin Sun


0

GUI Git

GUI Git có nút PUSH - bỏ qua phần chơi chữ và hộp thoại mở ra có hộp kiểm cho các thẻ.

Tôi đã đẩy một nhánh từ dòng lệnh, không có thẻ và sau đó thử đẩy lại nhánh bằng cách sử dụng --follow-tags tùy chọn được mô tả ở trên. Tùy chọn này được mô tả như các thẻ chú thích sau đây. Thẻ của tôi là thẻ đơn giản.

Tôi đã sửa một cái gì đó, gắn thẻ cam kết với bản sửa lỗi, (để đồng nghiệp có thể chọn bản sửa lỗi), sau đó thay đổi số phiên bản phần mềm và gắn thẻ bản phát hành tôi đã tạo (để đồng nghiệp có thể sao chép bản phát hành đó).

Git trở lại nói rằng mọi thứ đã được cập nhật. Nó không gửi các thẻ! Có lẽ vì các thẻ không được chú thích. Có lẽ bởi vì không có gì mới trên chi nhánh.

Khi tôi thực hiện một cú đẩy tương tự với Git GUI, các thẻ đã được gửi.

Các thẻ được gửi bằng GUI Git

Hiện tại, tôi sẽ chuyển các thay đổi của mình sang điều khiển từ xa bằng GUI Git chứ không phải bằng dòng lệnh và --follow-tags.

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.