2011-11-08 21 views
5

Quiero ejecutar el siguiente comando en un servidor remoto:¿Hay una manera simple de "describir git" un repositorio remoto?

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

El problema es que no sé lo que es $tag. Debería ser el resultado de git describe --abbrev=0 en un clon actualizado, pero no sé cómo obtener esa información sin hacer un clon local del repositorio. ¿Es posible hacer esto sin hacer un clon local?

Respuesta

3

La única forma en que podría comenzar el análisis de su etiqueta, sin añadir demasiado en el disco local, sería:

  • crea un repo vacío
  • agregar la dirección remota de tu repositorio remoto
  • probar un git fetch --dry-run

que cargará los archivos del módulo de la cesión temporal a distancia, sin embargo.
No creo que pueda consultar esta información sin descargar algo.

lo he hecho para un acuerdo de recompra gitolite por ejemplo:

[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 

Como se mencionó anteriormente, las únicas huellas son los archivos de paquete, por lo que al menos se puede limpiar fácilmente una vez que tenga su información:

[email protected]NC /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 
} 

Ejemplo de salida

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

Interesante opción. +1 – VonC

+3

'git ls-remote' es definitivamente lo que quieres. +1. – jszakmeister

+0

este es un script muy bueno y funciona muy bien en la línea de comandos ... pero no puedo usar awk en mi proyecto. entonces estoy tratando de extraer el significado de esto ... 'tag = $ 3' debe ser igual al nombre de la etiqueta, sin el prefijo refs/tags /, ¿verdad? curl -s sigue diciéndome 'Not Found' – shigazaru

Cuestiones relacionadas