2011-08-03 14 views
26

¿Hay alguna manera de etiquetar un repositorio remoto de git sin haberlo clonado localmente?Etiquetar un repositorio de git remoto sin clonarlo

Para correlacionar un repositorio de código con un repositorio de configuración, quiero (como paso de compilación CI) etiquetar lo que sea el encabezado actual del repositorio de configuración con build-n (donde N es el número de compilación actual proporcionado por Jenkins).

El repositorio de configuración no se usa como parte de la construcción, simplemente quiero una manera fácil de recuperar la revisión de configuración como cuando se construyó la versión 1234, y etiquetarla como "build-1234" parece la forma más sencilla de lograr esto.

+1

¿Cómo se accede a este repositorio? Por ejemplo, si se trata de un repositorio vacío y accede a él usando SSH, creo que puede ejecutar un comando de etiqueta sobre él a través de SSH. – Legolas

+0

@Legolas No, no puedes ejecutar ningún comando en el repositorio desnudo. –

+0

Acabo de intentar ejecutar 'git tag alpha master' en un repositorio simple, que funcionó. – Legolas

Respuesta

8

Para tener esto como una respuesta: en este momento no hay manera de hacer el etiquetado remoto con git, pero si tiene acceso de alguna manera al repositorio remoto (sin conexión), puede etiquetar en el control remoto ubicación.

Por ejemplo, si accede al repositorio de git a través de SSH, puede iniciar sesión usando SSH, ir al repositorio (vacío) y ejecutar el comando de etiqueta (git tag build-1234 master) en el repositorio (vacío).

(no estoy completamente seguro de la herramienta mencionada por @ ruslan-Kabalin)

+0

Si usa gitolite en su servidor, puede probar [gitolite custom command] (http://gitolite.com/gitolite/cookbook.html#adding-your-own-commands). – xmedeko

4

Es posible etiquetar la corriente se comprometen en la punta de una rama remota, pero no (por lo que puedo decir) con git porcelana o fontanería. Tendremos que hablar con un git receive-pack remoto directamente.

He aquí algunos pitón que utiliza dulwich a hacer lo que queremos:

#!/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

¿Cómo especifico un mensaje de etiqueta? – user1225999

Cuestiones relacionadas