Navegue e exiba arquivos em um repositório git sem clonar

107

Existe uma maneira de navegar e exibir arquivos em um repositório git sem cloná-lo primeiro? Posso fazer isso em svn usando os comandos:

svn ls / caminho / para / repo 
svn cat / path / to / repo / file-in-repo

Supostamente posso usar o git show, mas fazendo:

git show / path / to / repo
git show HEAD: / path / to / repo

resultado para

fatal: não é um repositório git
Christian Alis
fonte

Respostas:

72

O comando que você deseja git ls-remotepermite obter algumas informações sobre repositórios remotos, mas você não pode mostrar o histórico ou listar diretórios ou qualquer coisa desse nível: essencialmente, ele só permite ver os objetos remotos em um nível muito alto (você pode ver o HEADs e tags atuais, por exemplo).

A única maneira real de fazer o que você quer (se bem entendi) seria usar ssh para executar um comando remoto e retornar os resultados, por exemplo:

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

O que você quer seria uma funcionalidade adorável se eles pudessem adicioná-la, mas pelo que li não é muito fácil, uma vez que obter o histórico etc. precisa de muitas informações para ser local para o git, e nesse ponto você pode muito bem ter feito uma busca do git .

jkp
fonte
14
Uma coisa com a qual você pode fazer git clone, entretanto, é buscar apenas uma única revisão passando --depth 1. Isso evita a obtenção de quantidades potencialmente grandes de histórico e seria suficiente para responder a perguntas como "quais arquivos estão presentes na revisão abcdef1234567890?"
ctrueden
21

Git é um sistema de controle de versão distribuído , enquanto o Subversion é um sistema de controle de versão centralizado (cliente-servidor). Eles funcionam de forma diferente; acostume-se com isso. Por favor, leia minha resposta explicando as consequências dessa diferença para o equivalente git dasvn status -u questão no StackOverflow.

Me repetindo um pouco: em um sistema de controle de versão centralizado (como CVS ou Subversion) quase todos os comandos são processados ​​no servidor e envolvem rede. Poucos comandos são executados localmente. Note que para ter um bom desempenho de "svn status" e "svn diff" o Subversion armazena 'cópia original' da versão em check-out no cliente, para não ter que envolver transferência de rede para essas operações comuns (isto significa que o Subversion checkout = 2 x tamanho do diretório de trabalho, pelo menos).

Em um sistema de controle de versão distribuído (como Git, Mercurial ou Bazaar), onde você tem uma cópia local (clone) de um repositório inteiro, quase todos os comandos são executados no cliente . Muito poucos comandos requerem conexão de rede a outro repositório (para o servidor).

O número de comandos que você pode executar no servidor é limitado.

  • Você pode listar todas as referências no remoto com " git ls-remote <URL>".
  • Você pode obter um instantâneo de (parte) do repositório (se o servidor remoto o habilitou) com
    " git archive --remote = <URL> HEAD".
  • Você pode clonar apenas alguns últimos commits (chamados de "clone superficial") com
    " git clone --depth = 1 <URL>".
  • Se o servidor fornece interface da web git para o repositório, você pode usá-lo para navegar.
Jakub Narębski
fonte
36
Por mais correto que você esteja, se você está navegando em um repositório remoto sem primeiro cloná-lo, então, obviamente, você decidiu que não há problema em renunciar aos recursos offline do git. Considerando isso, não vejo razão para fingir que este não seria um recurso útil para algumas coisas, por exemplo, um cliente local que permite que você navegue pelo conteúdo de um arquivo de um repositório remoto localmente.
LadyCailin 01 de
12
Concordo, a posição que Jakub assume é altamente restritiva. Vale a pena perder a reputação mais de uma vez para apontar isso.
ctpenrose
9
Não gosto do tom "acostume-se com isso", mas ao ler até o fim encontrei uma solução para o meu problema atual - esperando ver o que há no repositório 110, tenho um git, mas sem acesso ssh ou shell, e quais são todos provavelmente muito grandes, cerca de 12 GB. Portanto, o clone com uma profundidade minimizada ajuda pelo menos a ver apenas uma história interessante recente. e tornar o repositório git o menor possível.
Henning
3
Seria bom ter essa funcionalidade no caso de ferramentas de revisão de código em que você não precisa de todo o repositório, apenas registrar as alterações é o suficiente.
Lukasz Lenart
2
@Henning, Certo, acho que você poderia chamá-lo de tom "idiota acostumado a isso" LOL
SN
17

Dê uma olhada em http://git-scm.com/book/en/Git-Internals-Transfer-Protocols para obter informações sobre como fazer isso em alguns protocolos de transporte. Observe que isso não funcionará para git padrão sobre SSH.

Para git sobre SSH, um git do lado do servidor atualizado deve permitir que você faça git-archive diretamente do remoto, que você poderia, por exemplo, canalizar para "tar t" para obter uma lista de todos os arquivos em um determinado commit.

Jerome Baum
fonte
13

GitHub é compatível com svn, então você pode usar svn ls

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

BitBucket suporta arquivo git para que você possa baixar o arquivo tar e listar arquivos arquivados. Não é muito eficiente, mas funciona:

git archive [email protected]:repository HEAD directory | tar -t
fela
fonte
6
Não confunda Git com GitHub :)
LR
também parece bastante frágil - rodando em muitos (cerca de 100) repositórios, recebo vários erros de svn: "não é possível obter entradas de não-diretório" "500 Erro interno do servidor" "Sem mais credenciais"
MichaelChirico
5

Não exatamente, mas uma maneira de contornar.

Use a API GitHub Developer

  1. Abrindo isso você terá os commits recentes.

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

    Você pode obter os detalhes específicos do commit anexando o hash do commit no final do url acima.

  2. Todos os arquivos (você precisa do sha para a árvore principal)

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

Espero que isso possa ajudar.

Anurag Kanungo
fonte
17
Não confunda Git com GitHub - acredito que as perguntas originais eram sobre o próprio Git. As instalações / hospedagens Git (GitHub / BitBucket / Stash) podem ter várias possibilidades para repositórios do navegador.
Krzysztof Wolny
Boa ideia @Anurag Kanungo Pensando fora da caixa 😉
eonista
2

Isso provavelmente é considerado sujo por alguns, mas uma solução muito prática no caso de repositórios github é apenas fazer um script, por exemplo, "git-ls":

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

Torná-lo executável e acessível é claro: chmod a+x git-ls; sudo cp git-ls /usr/local/bin. Agora, basta executá-lo como desejar:

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

Saiba também que existe um git instawebutilitário para seus arquivos locais. Ter a capacidade de mostrar arquivos e ter um servidor como esse, na minha opinião, não destrói nenhuma das características descentralizadas inerentes do git.

Anne van Rossum
fonte
Não estou obtendo nenhum resultado com isso. curl não parece retornar nada.
Mateus leu
Agora eu definitivamente recomendaria o método api da Anarug. Este método ainda funciona:curl -s https://github.com/Itseez/opencv | grep js-directory-link | sed 's|.* title="\(.*\)".*|\1|'
Anne van Rossum
-1

se você conhece o branch remoto que deseja verificar, pode descobrir o mais recente via:

git ls-tree -r <remote_branch> --name-only
LinconFive
fonte
8
não funciona se você não clonar o repo anteriormente :(
Bálint Szigeti