2011-11-08 17 views
5

Chcę wykonać następujące polecenie na zdalnym serwerze:Czy istnieje prosty sposób na "git opisać" zdalnego repozytorium?

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

Problem polega na tym, że nie wiem, co $tag jest. Powinien to być plik wyjściowy git describe --abbrev=0 na aktualnym klonie, ale nie wiem, jak uzyskać te informacje bez tworzenia lokalnego klonu repozytorium. Czy można to zrobić bez tworzenia lokalnego klona?

Odpowiedz

3

Jedynym sposobem można zacząć parsowania dla tagu, bez dodawania zbyt dużo na dysku lokalnym, byłoby:

  • uczynić pustą Repo
  • dodać zdalnego adresu zdalnego repo
  • spróbować git fetch --dry-run

To będzie ładować pliki paczkę zdalnego repo, choć.
Nie sądzę, że można po prostu przetworzyć te informacje bez pobierania coś.

Zrobiłem to dla gitolite repo na przykład:

[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 

Jak wspomniano powyżej, tylko ślady są pliki Pack, tak przynajmniej można łatwo oczyścić je raz masz swoje informacje:

[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 
} 

Przykładowe wyjście

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

Ciekawa opcja. +1 – VonC

+3

'git ls-remote' jest zdecydowanie tym, czego potrzebujesz. +1. – jszakmeister

+0

to jest bardzo fajny skrypt i działa bardzo dobrze na linii poleceń ... ale nie mogę użyć awk w moim projekcie. więc wiążę, aby wyodrębnić jego znaczenie ... 'tag = $ 3' powinien być równy nazwie tagu, bez refs/tags/prefix, prawda? curl -s powtarza mi 'Nie znaleziono' – shigazaru

Powiązane problemy