Chỉnh sửa, ngày 24 tháng 11 năm 2016: câu trả lời này rõ ràng là phổ biến, vì vậy tôi đang thêm một ghi chú ở đây. Nếu bạn thay thế một thẻ trên một máy chủ trung tâm, bất kỳ ai có thẻ cũ , bất kỳ bản sao nào của kho lưu trữ máy chủ trung tâm đã có thẻ đó đều có thể giữ lại thẻ cũ . Vì vậy, trong khi điều này cho bạn biết làm thế nào để làm điều đó, hãy thực sự chắc chắn rằng bạn muốn làm điều đó. Bạn sẽ cần phải nhờ tất cả những người đã có thẻ "sai" xóa "thẻ sai" của họ và thay thế bằng "thẻ đúng" mới.
Thử nghiệm trong Git 2.10 / 2.11 cho thấy giữ lại thẻ cũ là hành vi mặc định cho các máy khách đang chạy git fetch
và cập nhật là hành vi mặc định cho các máy khách đang chạy git fetch --tags
.
(Câu trả lời gốc sau.)
Khi bạn yêu cầu đẩy thẻ, hãy git push --tags
gửi (cùng với mọi cam kết và các đối tượng khác cần thiết và mọi cập nhật ref khác từ cài đặt đẩy) đến từ xa một yêu cầu cập nhật của biểu mẫu . (Chà, nó gửi rất nhiều: một trong số đó cho mỗi thẻ.)new-sha1 refs/tags/name
Yêu cầu cập nhật được điều chỉnh bởi điều khiển từ xa để thêm old-sha1
(hoặc một lần nữa, một cho mỗi thẻ), sau đó được gửi đến các móc nhận trước và / hoặc cập nhật (bất kỳ móc nào tồn tại trên điều khiển từ xa). Những cái móc đó có thể quyết định cho phép hoặc từ chối việc tạo / xóa / cập nhật thẻ.
Các old-sha1
giá trị là hoàn toàn số không "null" SHA-1 nếu thẻ đã được tạo ra. Đây new-sha1
là null SHA-1 nếu thẻ đang bị xóa. Mặt khác, cả hai giá trị SHA-1 là giá trị thực, hợp lệ.
Ngay cả khi không có móc, vẫn có một loại "móc tích hợp" cũng được chạy: điều khiển từ xa sẽ từ chối di chuyển thẻ trừ khi bạn sử dụng cờ "bắt buộc" (mặc dù "móc tích hợp" luôn ổn với cả hai "thêm" và "xóa"). Thông báo từ chối mà bạn nhìn thấy đang đến từ móc tích hợp này. (Ngẫu nhiên, cái móc tích hợp tương tự này cũng từ chối các bản cập nhật chi nhánh không được chuyển tiếp nhanh.) 1
Tuy nhiên, đây là một trong những chìa khóa để hiểu những gì đang diễn ra trên sàn git push
nhảy, không biết liệu điều khiển từ xa có thẻ đó hay không và nếu có thì giá trị SHA-1 của nó là gì. Nó chỉ nói "đây là danh sách đầy đủ các thẻ của tôi, cùng với các giá trị SHA-1 của chúng". Điều khiển từ xa so sánh các giá trị và nếu có bổ sung và / hoặc thay đổi, hãy chạy các móc trên đó. (Đối với các thẻ giống nhau, hoàn toàn không có gì. Đối với các thẻ bạn không có, chúng cũng không có gì!)
Nếu bạn xóa thẻ cục bộ, sau đó push
, việc đẩy của bạn chỉ đơn giản là không chuyển thẻ. Điều khiển từ xa giả định không có thay đổi nên được thực hiện.
Nếu bạn xóa thẻ cục bộ, sau đó tạo thẻ trỏ đến một địa điểm mới, sau đó push
, lần đẩy của bạn sẽ chuyển thẻ và từ xa sẽ xem đây là thay đổi thẻ và từ chối thay đổi, trừ khi đó là lực đẩy.
Vì vậy, bạn có hai lựa chọn:
- làm một lực đẩy, hoặc
- xóa thẻ trên điều khiển từ xa.
Loại thứ hai là có thể qua git push
2 mặc dù xóa thẻ trong nước và push
ing không có tác dụng. Giả sử tên của điều khiển từ xa là origin
và thẻ bạn muốn xóa là dev
:
git push origin :refs/tags/dev
Điều này yêu cầu điều khiển từ xa để xóa thẻ. Sự hiện diện hay vắng mặt của thẻ dev
trong kho lưu trữ cục bộ của bạn là không liên quan; loại này push
, với tư cách là một refspec, là một cú đẩy xóa thuần túy.:remoteref
Điều khiển từ xa có thể hoặc không cho phép xóa thẻ (tùy thuộc vào bất kỳ móc thêm nào được thêm vào). Nếu nó cho phép xóa, thì thẻ sẽ biến mất và thứ hai git push --tags
, khi bạn có một dev
thẻ cục bộ trỏ đến một số đối tượng repo thẻ cam kết hoặc chú thích, hãy gửi dev
thẻ mới của bạn . Trên điều khiển từ xa, dev
bây giờ sẽ là một thẻ mới được tạo, vì vậy điều khiển từ xa có thể sẽ cho phép đẩy (một lần nữa điều này phụ thuộc vào bất kỳ móc thêm nào được thêm vào).
Việc đẩy lực đơn giản hơn. Nếu bạn muốn chắc chắn không cập nhật bất cứ điều gì khác hơn so với thẻ, chỉ nói git push
để đẩy duy nhất mà một refspec:
git push --force origin refs/tags/dev:refs/tags/dev
(lưu ý: bạn không cần --tags
nếu bạn rõ ràng chỉ đẩy một thẻ ref-spec).
1 Tất nhiên, lý do cho hook tích hợp này là để giúp thực thi hành vi mà những người dùng khác của cùng một repo từ xa mong đợi: rằng các nhánh không được tua lại và các thẻ không di chuyển. Nếu bạn ép buộc, bạn nên cho những người dùng khác biết bạn đang làm điều này, để họ có thể sửa lỗi cho nó. Lưu ý rằng "các thẻ không di chuyển chút nào" mới được thi hành bởi Git 1.8.2; các phiên bản trước sẽ cho phép thẻ "di chuyển về phía trước" trong biểu đồ cam kết, giống như tên chi nhánh. Xem ghi chú phát hành git 1.8.2 .
2 Thật tầm thường nếu bạn có thể đăng nhập từ xa. Chỉ cần vào kho Git ở đó và chạy git tag -d dev
. Lưu ý rằng một trong hai cách mà xóa việc xóa thẻ trên điều khiển từ xa hoặc sử dụng git push
để xóa nó, có một khoảng thời gian khi bất kỳ ai truy cập vào điều khiển từ xa sẽ thấy rằng dev
thẻ bị thiếu. (Họ sẽ tiếp tục có thẻ cũ của riêng họ , nếu họ đã có thẻ đó và thậm chí họ có thể đẩy thẻ cũ của họ trở lại trước khi bạn có thể đẩy thẻ mới.)