Examinar y mostrar archivos en un repositorio de git sin clonar

107

¿Hay alguna forma de buscar y mostrar archivos en un repositorio de git sin clonarlo primero? Puedo hacer eso en svn usando los comandos:

svn ls / ruta / a / repo 
svn cat / path / to / repo / file-in-repo

Supuestamente puedo usar git show pero haciendo:

git show / ruta / a / repo
git show HEAD: / ruta / a / repo

resultado de

fatal: no es un repositorio de git
Christian Alis
fuente

Respuestas:

72

El comando que desea es el git ls-remoteque le permite obtener información sobre repositorios remotos, pero no puede mostrar el historial o listar directorios ni nada de ese nivel: esencialmente solo le permite ver los objetos remotos en un nivel muy alto (puede ver el HEADs y etiquetas actuales, por ejemplo).

La única forma real de hacer lo que quiere (si lo entiendo correctamente) sería usar ssh para ejecutar un comando remoto y devolver los resultados, por ejemplo:

ssh me@otherhost "cd repo && git log -n 10"

Lo que querría sería una funcionalidad encantadora si pudieran agregarla, pero por lo que leí no es muy fácil ya que obtener el historial, etc.necesita mucha información para ser local en git, y en ese momento es posible que haya hecho un git fetch .

jkp
fuente
14
Sin git cloneembargo, una cosa que puede hacer es obtener solo una revisión pasando --depth 1. Esto evita obtener grandes cantidades de historial y sería suficiente para responder preguntas como "¿qué archivos están presentes en la revisión abcdef1234567890?"
ctrueden
21

Git es un sistema de control de versiones distribuido , mientras que Subversion es un sistema de control de versiones centralizado (cliente-servidor). Funcionan de manera diferente; acostumbrarse a eso. Lea mi respuesta que explica las consecuencias de esa diferencia para git equivalente a lasvn status -u pregunta en StackOverflow.

Repitiendo un poco: en un sistema de control de versiones centralizado (como CVS o Subversion) casi todos los comandos se procesan en el servidor e involucran a la red. Muy pocos comandos se ejecutan localmente. Tenga en cuenta que para tener un buen rendimiento de "svn status" y "svn diff", Subversion almacena una 'copia prístina' de la versión extraída en el cliente, para no tener que involucrar la transferencia de red para esas operaciones comunes (esto significa que Subversion checkout = 2 x tamaño del directorio de trabajo al menos).

En el sistema de control de versiones distribuido (como Git, Mercurial o Bazaar), donde tiene una copia local (clon) de un repositorio completo, casi todos los comandos se ejecutan en el cliente . Muy pocos comandos requieren una conexión de red a otro repositorio (al servidor).

La cantidad de comandos que puede realizar en el servidor es limitada.

  • Puede listar todas las referencias en remoto con " git ls-remote <URL>".
  • Puede obtener una instantánea de (parte) del repositorio (si el servidor remoto lo habilitó) con
    " git archive --remote = <URL> HEAD".
  • Puede clonar solo algunas últimas confirmaciones (lo que se denomina "clonación superficial") con
    " git clone --depth = 1 <URL>".
  • Si el servidor proporciona una interfaz web git al repositorio, puede usarla para navegar.
Jakub Narębski
fuente
36
Tan correcto como eres, si estás navegando en un repositorio remoto sin clonarlo primero, entonces obviamente has decidido que está bien renunciar a las capacidades sin conexión de git. Dado eso, no veo ninguna razón para pretender que esta no sería una función útil para algunas cosas, por ejemplo, un cliente local que le permite navegar por el contenido del archivo de un repositorio remoto localmente.
LadyCailin
12
De acuerdo, la posición que toma Jakub es muy restrictiva. Vale la pena perder reputación más de una vez para señalar esto.
ctpenrose
9
No me gusta el tono de "acostumbrarse a eso", pero cuando lo leí hasta el final encontré una solución a mi problema actual - esperando ver qué hay en el repositorio 110 Tengo un git, pero no tengo acceso a ssh o shell, y cuáles son probablemente todos bastante grandes, unos 12 GB más o menos. Entonces, el clon con una profundidad minimizada ayuda al menos a ver solo la historia interesante reciente. y hacer que el repositorio de git sea lo más pequeño posible.
Henning
3
Sería bueno tener dicha funcionalidad en caso de herramientas de revisión de código donde no necesita todo el repositorio, solo registrar los cambios es suficiente.
Lukasz Lenart
2
@Henning, tienes razón, supongo que podrías llamarlo el tono de "idiota acostumbrado a ese" LOL
SN
17

Eche un vistazo a http://git-scm.com/book/en/Git-Internals-Transfer-Protocols para obtener información sobre cómo hacer esto en algunos protocolos de transporte. Tenga en cuenta que esto no funcionará para git estándar sobre SSH.

Para git sobre SSH, un git del lado del servidor actualizado debería permitirle git-archive directamente desde el control remoto, que luego podría, por ejemplo, canalizar a "tar t" para obtener una lista de todos los archivos en una determinada confirmación.

Jerome Baum
fuente
13

GitHub es compatible con svn, por lo que puede usar svn ls

svn ls https://github.com/user/repository.git/branches/master/

BitBucket admite archivos git para que pueda descargar archivos tar y enumerar archivos archivados. No es muy eficiente pero funciona:

git archive [email protected]:repository HEAD directory | tar -t
fela
fuente
6
No confunda Git con GitHub :)
LR
también se siente bastante frágil - ejecutándose en muchos repositorios (alrededor de 100), obtengo varios errores de svn: "no se pueden obtener entradas que no son del directorio" "500 Error interno del servidor" "No más credenciales"
MichaelChirico
5

No exactamente, sino una forma de evitarlo.

Utilice la API de desarrollador de GitHub

  1. Al abrir esto, obtendrá las confirmaciones recientes.

    https://api.github.com/repos/learningequality/ka-lite/commits

    Puede obtener los detalles de confirmación específicos adjuntando el hash de confirmación al final de la URL anterior.

  2. Todos los archivos (necesitas sha para el árbol principal)

    https://api.github.com/repos/learningequality/ka-lite/git/trees/7b698a988683b161bdcd48a949b01e2b336b4c01

Espero que esto pueda ayudar.

Anurag Kanungo
fuente
17
No confunda Git con GitHub: creo que las preguntas originales eran sobre Git en sí. Las instalaciones / alojamientos de Git (GitHub / BitBucket / Stash) pueden tener varias posibilidades para los repositorios del navegador.
Krzysztof Wolny
Buena idea @Anurag Kanungo Pensando fuera de la caja 😉
eonist
2

Esto probablemente sea considerado sucio por algunos, pero una solución muy práctica en el caso de repositorios github es simplemente hacer un script, por ejemplo, "git-ls":

#!/bin/sh
remote_url=${1:? "$0 requires URL as argument"}
curl -s $remote_url | grep js-directory-link | sed "s/.* title=\"\(.*\)\".*/\1/"

Hacerlo ejecutable y se puede llegar por supuesto: chmod a+x git-ls; sudo cp git-ls /usr/local/bin. Ahora, ejecútelo como desee:

git-ls https://github.com/mrquincle/aim-bzr
git-ls https://github.com/mrquincle/aim-bzr/tree/master/aim_modules

También sepa que existe una git instawebutilidad para sus archivos locales. Tener la capacidad de mostrar archivos y tener un servidor como ese, en mi opinión, no destruye ninguna de las características descentralizadas inherentes de git.

Anne van Rossum
fuente
No obtengo ningún resultado con esto. curl no parece devolver nada.
Mateo Leer
Ahora definitivamente recomendaría el método api de Anarug. Sin embargo, este método todavía funciona:curl -s https://github.com/Itseez/opencv | grep js-directory-link | sed 's|.* title="\(.*\)".*|\1|'
Anne van Rossum
-1

si conoce la sucursal remota que desea verificar, puede averiguar la última a través de:

git ls-tree -r <remote_branch> --name-only
LinconFive
fuente
8
no funciona si no clona el repositorio previamente :(
Bálint Szigeti