2010-09-04 40 views
5

¿Hay alguna manera de descargar mediante programación un solo archivo desde un repositorio remoto de git, en Java?Obtiene un solo archivo de un repositorio remoto de git

  1. Prefiero una solución que utiliza el menor ancho de banda posible, preferiblemente solo la descarga de ese único archivo. No necesito navegar por el repositorio, ya tengo la ruta del archivo.
  2. Prefiero una solución que no dependa de otras aplicaciones (por ejemplo, una instalación de otro cliente de Git en la máquina). Una biblioteca Java que contiene una implementación de cliente git sería óptima.

que era capaz de hacer algo similar con el uso de Subversion SVNKit y he visto que hay una aplicación Java puro del GIT (eclipse's JGit), que podría ser capaz de hacer algo similar, así que espero que haya una respuesta positiva ; aunque por lo que entiendo acerca de cómo funciona Git, permitiendo actualizaciones solo desde repositorios locales, esto podría ser problemático.

+0

Por lo que entiendo, jgit todavía está trabajando para proporcionar todas las características de git - es poco probable que proporcione características que no tiene. – Cascabel

+0

No creo que esto sea posible en el caso general, es decir, cuando solo tiene acceso a través del protocolo git. No creo que los mecanismos normales de transporte brinden ninguna forma de acceder a archivos individuales. Estoy bastante seguro de que tendrás que instalar algo en el control remoto (por ejemplo, gitweb) u obtener acceso al sistema de archivos a un repositorio (ya sea el control remoto o un clon local, posiblemente poco profundo). – Cascabel

Respuesta

8

git no está diseñado para acceder a un solo archivo desde un repositorio remoto pero puede abusar de git archive para esto. El inconveniente es que tienes que descargar un "árbol" en lugar de simplemente la gota que necesitas.

E.g.

git archive --remote=url://to.git.repo branch path/to/dir | tar -x file 

Como alternativa, si tiene gitweb establecido en el repositorio remoto puede utilizar un bucle simple o comando wget para descargar cualquier archivo en su formato "crudo".

+0

Eso es un asombroso kludge. – Cascabel

+2

Tenga en cuenta que para el protocolo 'git: //' tiene, por lo que recuerdo, habilitar explícitamente el servicio adecuado para permitir el acceso remoto de 'git archive'. –

+0

¿Qué es 'path/to/dir'? –

0

Quoth git-clone(1):

profundidad --depth

crear un clon de poca profundidad con una historia truncado para el especificado número de revisiones. Un repositorio poco profundo tiene una serie de limitaciones de (no puede clonar ni recuperar de él, ni insertar desde ni en él), pero es adecuado si solo está interesado en el reciente historia de un proyecto grande con una larga historia y quisiera enviar correcciones como parches.

Por lo tanto, la granularidad es un directorio pero puede limitar el historial de revisiones.

+1

También podría usar '--no-checkout' para evitar crear todo el directorio de trabajo. Sin efecto de ancho de banda, pero ahorra mucha creación de archivos. – Cascabel

3

¿Qué tipo de acceso tiene para el repositorio remoto? ¿Es a través de SSH, puedes llamar a los comandos? Si es así, solo puede invocar git show HEAD:$path_to_file.

Si no puede invocar comandos en esa máquina, aún es posible hacerlo, pero deberá comprender el formato del repositorio de Git. (Eso es mucho menos aterrador de lo que suena, ya que es muy simple por diseño. A diferencia de, por ejemplo, Subversion, el formato del repositorio no está pensado como un recuadro negro.)

+0

Si puede ejecutar gitweb en el control remoto, puede hacerlo también. – Cascabel

Cuestiones relacionadas