Làm thế nào để bạn đẩy một thẻ Git đến một chi nhánh bằng cách sử dụng một refspec?


216

Tôi muốn buộc đẩy, ví dụ, thẻ 1.0.0của tôi đến masterchi nhánh từ xa của tôi .

Bây giờ tôi đang làm như sau:

git push production +1.0.0:master

Tôi muốn buộc đẩy , bởi vì tất cả những gì tôi quan tâm là mã bên trong1.0.0thẻ được đẩy đếnmasternhánh trên kho lưu trữ từ xa.

Tôi đang làm gì sai?

Cập nhật số 1

Khi tôi SSH vào máy chủ của mình nơi lưu trữ Git của tôi và thực thi git branch -l, tôi cũng không thấy masterchi nhánh được liệt kê.

Cập nhật số 2

Sau khi chạy git tag -ltừ bên trong kho Git từ xa, tôi thấy nó masterđược liệt kê, có nghĩa là khi tôi chạy như sau:

git push production 1.0.0:master

Nó thực sự đã đẩy thẻ và tạo ra một thẻ có tên master chứ không phải là một nhánh mới .

Về cơ bản, tôi muốn đẩy nội dung của thẻ 1.0.0vào masternhánh của kho Git từ xa.


Bạn có thể làm rõ "không hoạt động" nghĩa là gì? Git có đưa ra một lỗi cụ thể không, hay nó có ảnh hưởng null không?
vcsjones

Tôi xin lỗi. Vâng, về cơ bản khi tôi SSH vào máy chủ của mình, vào kho git và chạy git Branch -l để liệt kê các nhánh, tôi chỉ thấy nhánh khác của mình. Tuy nhiên, git đẩy sản xuất +1.0.0: master đã đẩy, khi tôi đẩy lại, nó nói Mọi thứ cập nhật , nhưng tôi không thấy nhánh chính trên máy chủ từ xa.
Michael van Rooijen

5
Bạn nên thay đổi câu trả lời được chấp nhận. Câu trả lời thứ hai đơn giản hơn nhiều so với câu trả lời được đánh dấu là chấp nhận.
Pedro Rolo

Xin lỗi vì sự phản ứng chậm. Tôi đồng ý và hiện đã thay đổi câu trả lời được chấp nhận.
Michael van Rooijen

1
@MichaelvanRooijen Tôi không hiểu câu trả lời được chấp nhận mà bạn chọn thực sự giải quyết vấn đề này như thế nào . Nó không ghi đè lên một nhánh bằng một thẻ, nó chỉ đẩy các thẻ của bạn đến điều khiển từ xa.

Câu trả lời:


61

Nó có thể thất bại vì 1.0.0là một thẻ chú thích. Có lẽ bạn đã thấy thông báo lỗi sau:

lỗi: Đang cố gắng ghi đối tượng không cam kết vào nhánh refs / Heads / master

Các thẻ được chú thích có loại đối tượng riêng biệt của chúng trỏ đến đối tượng cam kết được gắn thẻ. Các nhánh không thể trỏ đến các đối tượng thẻ một cách hữu ích, chỉ cam kết các đối tượng. Bạn cần phải bóc vỏ thẻ Thẻ chú thích trở lại để cam kết đối tượng và thay vào đó đẩy nó.

git push production +1.0.0^{commit}:master
git push production +1.0.0~0:master          # shorthand

Có một cú pháp khác cũng sẽ hoạt động trong trường hợp này, nhưng nó có nghĩa là hơi khác nếu đối tượng thẻ trỏ đến một thứ khác không phải là một cam kết (hoặc một đối tượng thẻ trỏ đến (một đối tượng thẻ trỏ đến một)) một cam kết) .

git push production +1.0.0^{}:master

Các cú pháp lột thẻ này được mô tả trong git-rev-parse (1) trong phần Chỉ định Sửa đổi .


1
Điều này đã giải quyết vấn đề! Tuy nhiên, nhánh chủ cần tồn tại. Đây không phải là một vấn đề về phía tôi. Cảm ơn sự giúp đỡ của bạn!
Michael van Rooijen

2
@Michael: À. Có, nếu master không tồn tại (dưới dạng nhánh hoặc thẻ), thì git push rep +tag:mastersẽ tạo thẻ có tên master thay vì nhánh. git push rep +tag~0:master(một lần nữa, khi master không tồn tại dưới dạng một nhánh hoặc một thẻ) sẽ thất bại với lỗi lỗi: không thể đẩy đến đích đích không đủ tiêu chuẩn. Lệnh mà có thể đã thực hiện những gì bạn muốn (trước khi bất kỳ chủ chi nhánh / thẻ tồn tại) là git push rep +tag~0:refs/heads/master( refs/heads/là không gian tên, theo đó các chi nhánh được lưu trữ).
Chris Johnsen

TUYỆT QUÁ! Điều đó sẽ giúp tôi rất tốt. Rât thuận tiện! Cảm ơn rất nhiều vì đã đăng thông tin đó là tốt.
Michael van Rooijen

4
@brad: ~{commit}Cú pháp là bằng chữ (nghĩa là luôn luôn là chín ký tự); từ commitnày không phải là một giữ chỗ ở đây
Chris Johnsen

1
à ok xin lỗi, tôi đã nghĩ rằng bạn có nghĩa là đưa vào cam kết cụ thể, có ý nghĩa hơn bây giờ.
brad

469
git push --tags production

4
Nếu thẻ đã tồn tại trên điều khiển từ xa, trước tiên bạn cần xóa thẻ từ xa git push production :1.0.0.
tôn trọng TheCode

1
Nếu trong bất kỳ trường hợp nào, bạn sẽ có chi nhánh có cùng tên: '1.0.0', lần đẩy này sẽ không sử dụng tốt hơn: git push production :refs/tags/1.0.0chỉ xóa thẻ
Vladimir

1
@Nerian: Tôi nghĩ rằng nó chỉ đẩy các thẻ
bstpierre

5
Làm thế nào điều này thực sự giải quyết vấn đề của người gửi ban đầu về việc ghi đè một nhánh bằng một thẻ bằng cách đẩy nó? Điều này chỉ cần đẩy tất cả các thẻ của bạn vào một điều khiển từ xa, nó sẽ không ghi đè lên bất kỳ chi nhánh nào.

1
Không phải là câu hỏi hỏi làm thế nào để đẩy một thẻ? Lệnh này còn làm được nhiều hơn thế.
Chris Martin

61

Tôi tạo thẻ như thế này và sau đó tôi đẩy nó sang GitHub:

git tag -a v1.1 -m "Version 1.1 is waiting for review"
git push --tags

Counting objects: 1, done.
Writing objects: 100% (1/1), 180 bytes, done.
Total 1 (delta 0), reused 0 (delta 0)
To git@github.com:neoneye/triangle_draw.git
 * [new tag]         v1.1 -> v1.1

4
nó đẩy tất cả các thẻ của bạn
Dawid Drozd

2
Lưu ý rằng điều này sẽ không thực sự giải quyết vấn đề của người đăng ban đầu về việc ghi đè một nhánh bằng thẻ, nó sẽ chỉ đẩy các thẻ của bạn đến một điều khiển từ xa, mà không ảnh hưởng đến các chi nhánh.

10

Để đẩy một thẻ duy nhất: git push <reponame> <tagname>

Ví dụ , git push production 1.0.0. Các thẻ không bị ràng buộc với các chi nhánh, chúng bị ràng buộc để cam kết.

Khi bạn muốn có nội dung của thẻ trong nhánh chính, hãy thực hiện điều đó cục bộ trên máy của bạn. Tôi sẽ giả định rằng bạn tiếp tục phát triển trong chi nhánh tổng thể địa phương của bạn. Sau đó chỉ là một git push origin masterđủ.


5
Lưu ý rằng điều này sẽ không thực sự giải quyết vấn đề của người đăng ban đầu về việc ghi đè một nhánh bằng thẻ, nó sẽ chỉ đẩy các thẻ của bạn đến một điều khiển từ xa, mà không ảnh hưởng đến các chi nhánh.
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.