2011-11-08 32 views
5

Tôi muốn thực hiện lệnh sau trên một máy chủ từ xa:Có cách nào đơn giản để "git mô tả" một kho lưu trữ từ xa không?

git archive --prefix="$tag/" --remote="ssh://$gitserver/var/git/$repo" "$tag" | tar -xvf- 

Vấn đề là tôi không biết $tag là gì. Nó phải là đầu ra của git describe --abbrev=0 trên bản sao cập nhật, nhưng tôi không biết cách lấy thông tin đó mà không tạo bản sao cục bộ của kho lưu trữ. Có thể làm điều này mà không cần tạo bản sao cục bộ không?

Trả lời

3

Cách duy nhất bạn có thể bắt đầu phân tích cho thẻ của bạn, mà không cần thêm quá nhiều vào đĩa địa phương của bạn, sẽ là:

  • thực hiện một repo trống
  • thêm địa chỉ từ xa của repo từ xa của bạn
  • thử một git fetch --dry-run

Đó sẽ được tải các tập tin gói của repo từ xa, mặc dù.
Tôi không nghĩ bạn chỉ có thể truy vấn thông tin này mà không cần tải xuống nội dung nào đó.

Tôi đã làm nó cho một repo gitolite ví dụ:

[email protected] /c/prog/git 
$ git init g2 
Initialized empty Git repository in c:/prog/git/g2/.git/ 

[email protected] /c/prog/git 
$ cd g2 

[email protected] /c/prog/git/g2 (master) 
$ git remote add origin https://github.com/sitaramc/gitolite.git 

[email protected] /c/prog/git/g2 (master) 
$ git fetch --dry-run 
remote: Counting objects: 5114, done. 
remote: Compressing objects: 100% (1919/1919), done. 
remote: Total 5114 (delta 3548), reused 4664 (delta 3142) 
Receiving objects: 100% (5114/5114), 1.81 MiB | 722 KiB/s, done. 
Resolving deltas: 100% (3548/3548), done. 
From https://github.com/sitaramc/gitolite 
* [new branch]  bp-v2.0.3 -> origin/bp-v2.0.3 
* [new branch]  fedora-temp -> origin/fedora-temp 
* [new branch]  gh-pages -> origin/gh-pages 
* [new branch]  master  -> origin/master 
* [new branch]  pu   -> origin/pu 
* [new branch]  temp-br--data-dumper-problem-demo -> origin/temp-br--data-dumper-problem-demo 
* [new branch]  vrs  -> origin/vrs 
* [new tag]   v2.1  -> v2.1 
From https://github.com/sitaramc/gitolite 
* [new tag]   v0.50  -> v0.50 
* [new tag]   v0.55  -> v0.55 
[...] 
* [new tag]   v2.0rc2 -> v2.0rc2 
* [new tag]   v2.1  -> v2.1 
            ^^^^ 
            | 
            --- could be the tag you need 

Như đã đề cập ở trên, dấu vết duy nhất là các tập tin gói, vì vậy ít nhất bạn có thể dễ dàng làm sạch chúng một khi bạn có thông tin của bạn:

[email protected] /c/prog/git/g2 (master) 
$ l .git/objects/pack/ 
total 1000 
drwxr-xr-x 4 VonC  Administ  0 Nov 8 19:45 .. 
-r--r--r-- 1 VonC  Administ 1898987 Nov 8 19:46 pack-c70771bc8a5ecc099ed88da0c3f631f84b34fe9d.pack 
-r--r--r-- 1 VonC  Administ 144264 Nov 8 19:46 pack-c70771bc8a5ecc099ed88da0c3f631f84b34fe9d.idx 
drwxr-xr-x 2 VonC  Administ  4096 Nov 8 19:46 . 
11
#!/usr/bin/awk -f 
BEGIN { 
    FS = "[ /^]+" 
    while ("git ls-remote " ARGV[1] "| sort -Vk2" | getline) { 
    if (!sha) 
     sha = substr($0, 1, 7) 
    tag = $3 
    } 
    while ("curl -s " ARGV[1] "/releases/tag/" tag | getline) 
    if ($3 ~ "commits") 
     com = $2 
    printf com ? "%s-%s-g%s\n" : "%s\n", tag, com, sha 
} 

mẫu đầu ra

$ git-describe-remote.awk https://github.com/stedolan/jq 
jq-1.4-148-g89791a0 
+2

Tùy chọn thú vị. +1 – VonC

+3

'git ls-remote' chắc chắn là thứ bạn muốn. +1. – jszakmeister

+0

đây là một kịch bản rất hay và nó hoạt động rất tốt trên dòng lệnh ... nhưng tôi không thể sử dụng awk trong dự án của mình. vì vậy tôi buộc phải trích xuất ý nghĩa của nó ... 'tag = $ 3' phải bằng tên thẻ, không có tiền tố/thẻ/tiền tố, phải không? curl -s giữ cho tôi biết 'Không tìm thấy' – shigazaru

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