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

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 .


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.

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.


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 --remote=git@bitbucket.org:repository HEAD directory | tar -t

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.


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.


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

8
não funciona se você não clonar o repo anteriormente :(
Bálint Szigeti
Ao utilizar nosso site, você reconhece que leu e compreendeu nossa Política de Cookies e nossa Política de Privacidade.
Licensed under cc by-sa 3.0 with attribution required.