2011-08-03 37 views
26

Có cách nào để gắn thẻ kho git từ xa mà không cần sao chép nó cục bộ?Gắn thẻ kho lưu trữ git từ xa mà không cần nhân bản nó

Để tương quan một kho lưu trữ mã với một kho lưu trữ cấu hình, tôi muốn (như là một bước xây dựng CI) bất cứ điều gì là người đứng đầu hiện tại của kho cấu hình với build-n (trong đó N là số bản dựng hiện tại được cung cấp bởi jenkins). Kho lưu trữ cấu hình không được sử dụng như là một phần của bản dựng, tôi chỉ muốn một cách dễ dàng để tìm nạp bản sửa đổi cấu hình như khi phiên bản ví dụ 1234 được xây dựng và gắn thẻ là "build-1234" có vẻ như cách đơn giản nhất để đạt được điều này.

+1

Làm cách nào để bạn truy cập vào kho lưu trữ này? Ví dụ, nếu đây là một kho lưu trữ trống và bạn truy cập nó bằng SSH, tôi nghĩ bạn có thể thực thi lệnh tag trên nó qua SSH. – Legolas

+0

@Legolas Không, bạn không thể chạy bất kỳ lệnh nào trong repo trần. –

+0

Tôi vừa thử chạy 'git tag alpha master' trên một kho lưu trữ trống, nó hoạt động. – Legolas

Trả lời

8

Để có điều này như một câu trả lời: hiện tại không có cách nào để thực hiện gắn thẻ từ xa với git, nhưng nếu bạn có quyền truy cập theo cách nào đó đến kho lưu trữ từ xa, bạn có thể gắn thẻ trên điều khiển từ xa vị trí. Ví dụ, nếu bạn truy cập kho git thông qua SSH, bạn có thể đăng nhập bằng SSH, vào kho (bare) và thực thi lệnh tag (git tag build-1234 master) trong kho (bare).

(Tôi không hoàn toàn chắc chắn về công cụ được đề cập bởi @ Ruslan-kabalin)

+0

Nếu bạn sử dụng gitolite trên máy chủ của mình, bạn có thể thử [lệnh tùy chỉnh gitolite] (http://gitolite.com/gitolite/cookbook.html#adding-your-own-commands). – xmedeko

4

Có thể gắn thẻ hiện cam kết tại đỉnh của một chi nhánh từ xa, nhưng không (như xa như tôi có thể nói) với git sứ hoặc hệ thống ống nước. Chúng tôi sẽ phải nói chuyện trực tiếp từ xa git receive-pack.

Dưới đây là một số trăn sử dụng dulwich để làm những gì chúng ta muốn:

#!/usr/bin/env python 

from dulwich.client import get_transport_and_path 
import sys 


def tag_remote_branch(repo_url, branch, tag): 
    client, path = get_transport_and_path(repo_url) 

    def determine_wants(refs): 
     tag_ref_name = 'refs/tags/%s' % tag 
     branch_ref_name = 'refs/heads/%s' % branch 
     # try not to overwrite an existing tag 
     if tag_ref_name in refs: 
      assert refs[tag_ref_name] == refs[branch_ref_name] 
     refs[tag_ref_name] = refs[branch_ref_name] 
     return refs 

    # We know the other end already has the object referred to by our tag, so 
    # our pack should contain nothing. 
    def generate_pack_contents(have, want): 
     return [] 

    client.send_pack(path, determine_wants, generate_pack_contents) 


if __name__ == '__main__': 
    repo_url, branch, tag = sys.argv[1:] 
    tag_remote_branch(repo_url, branch, tag) 
+0

Tôi sẽ chỉ định thông báo thẻ như thế nào? – user1225999

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