Sfoglia e visualizza i file in un repository git senza clonazione


107

C'è un modo per sfogliare e visualizzare i file in un repository Git senza prima clonarlo? Posso fare quelli in svn usando i comandi:

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

Potrei presumibilmente usare git show ma facendo:

git mostra / percorso / a / repo
git mostra HEAD: / path / to / repo

risultato a

fatale: non è un repository git

Risposte:


72

Il comando che desideri è git ls-remoteche ti consente di ottenere alcune informazioni sui repository remoti, ma non puoi mostrare la cronologia o le directory degli elenchi o qualsiasi altra cosa di quel livello: essenzialmente ti consente solo di vedere gli oggetti remoti a un livello molto alto (puoi vedere il HEAD e tag attuali, ad esempio).

L'unico vero modo per fare quello che vuoi (se ho capito bene) sarebbe usare ssh per eseguire un comando remoto e restituire i risultati, ad esempio:

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

Quello che vorresti sarebbe una funzionalità adorabile se potessero aggiungerlo, ma da quello che ho letto non è molto facile poiché ottenere la cronologia, ecc., Richiede molte informazioni per essere locale su git, ea quel punto potresti anche aver fatto un git fetch .


14
Una cosa che puoi fare git clone, tuttavia, è recuperare solo una singola revisione passando --depth 1. Ciò evita il recupero di quantità potenzialmente grandi di cronologia e sarebbe sufficiente per rispondere a domande come "quali file sono presenti in revisione abcdef1234567890?"
ctrueden

21

Git è un sistema di controllo delle versioni distribuito , mentre Subversion è un sistema di controllo delle versioni centralizzato (client-server). Funzionano diversamente; ci si abitua. Si prega di leggere la mia risposta che spiega le conseguenze di tale differenza rispetto all'equivalente di git dellasvn status -u domanda su StackOverflow.

Ripeto un po ': nel sistema di controllo delle versioni centralizzato (come CVS o Subversion) quasi tutti i comandi vengono elaborati sul server e coinvolgono la rete. Pochissimi comandi vengono eseguiti localmente. Nota che per avere buone prestazioni di "svn status" e "svn diff" Subversion memorizza la 'copia incontaminata' della versione ritirata sul client, per non dover coinvolgere il trasferimento di rete per quelle operazioni comuni (questo significa che il checkout di Subversion = 2 x dimensione della directory di lavoro almeno).

Nel sistema di controllo della versione distribuito (come Git, Mercurial o Bazaar), dove hai una copia locale (clone) di un intero repository, quasi tutti i comandi vengono eseguiti sul client . Pochissimi comandi richiedono una connessione di rete ad un altro repository (al server).

Il numero di comandi che puoi eseguire sul server è limitato.

  • Puoi elencare tutti i riferimenti in remoto con " git ls-remote <URL>".
  • È possibile ottenere un'istantanea di (parte) del repository (se il server remoto lo ha abilitato) con
    " git archive --remote = <URL> HEAD".
  • Puoi clonare solo alcuni ultimi commit (il cosiddetto "clone superficiale") con
    " git clone --depth = 1 <URL>".
  • Se il server fornisce l'interfaccia web git al repository, puoi usarla per navigare.

36
Per quanto tu sia corretto, se stai esplorando un repository remoto senza prima clonarlo, ovviamente hai deciso che è giusto rinunciare alle funzionalità offline di git. Detto questo, non vedo alcun motivo per fingere che questa non sia una funzionalità utile per alcune cose, ad esempio un client locale che consente di sfogliare localmente il contenuto del file di un repository remoto.
LadyCailin

12
D'accordo, la posizione che assume Jakub è molto restrittiva. Vale la pena perdere la reputazione più di una volta per farlo notare.
ctpenrose

9
Non mi piace il tono di "abituarsi a quel"., Ma leggendo fino alla fine ho trovato una soluzione al mio problema attuale - desiderando vedere cosa c'è nel repository 110 ho un git, ma nessun accesso ssh o shell, e quali sono probabilmente tutto abbastanza grande, circa 12 GB. Quindi il clone con una profondità ridotta al minimo aiuta almeno a vedere solo la storia interessante recente. e rendi il repository git il più piccolo possibile.
Henning

3
Tale funzionalità sarebbe piacevole da avere in caso di strumenti di revisione del codice in cui non è necessario l'intero repository è sufficiente solo il log con le modifiche.
Lukasz Lenart

2
@ Henning, hai ragione, immagino che potresti chiamarlo il tono "git used to that" LOL
SN

17

Dai un'occhiata a http://git-scm.com/book/en/Git-Internals-Transfer-Protocols per informazioni su come eseguire questa operazione su alcuni protocolli di trasporto. Nota che questo non funzionerà per git standard su SSH.

Per git su SSH, un git lato server aggiornato dovrebbe consentirti di archiviare git direttamente dal remoto, che potresti quindi ad esempio pipe a "tar t" per ottenere un elenco di tutti i file in un dato commit.


13

GitHub è compatibile con svn, quindi puoi usare svn ls

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

BitBucket supporta l'archivio git in modo da poter scaricare l'archivio tar ed elencare i file archiviati. Non è molto efficiente ma funziona:

git archive --remote=git@bitbucket.org:repository HEAD directory | tar -t

6
Non confondere Git con GitHub :)
LR

sembra anche piuttosto fragile - in esecuzione su molti (circa 100) repository, ottengo vari errori da svn: "impossibile ottenere voci non di directory" "500 Errore interno del server" "Niente più credenziali"
MichaelChirico

5

Non esattamente, ma un modo per aggirare.

Utilizza l'API per sviluppatori GitHub

  1. Aprendolo otterrai i commit recenti.

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

    È possibile ottenere i dettagli specifici del commit allegando l'hash del commit alla fine dell'URL sopra.

  2. Tutti i file (è necessario sha per l'albero principale)

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

Spero che questo possa aiutare.


17
Non confondere Git con GitHub: credo che le domande originali riguardassero Git stesso. Le installazioni / host di Git (GitHub / BitBucket / Stash) possono avere varie possibilità per i repository del browser.
Krzysztof Wolny

Buona idea @Anurag Kanungo Thinking outside the box 😉
eonista

2

Questo è probabilmente considerato sporco da alcuni, ma una soluzione molto pratica in caso di repository github è semplicemente creare uno script, ad esempio "git-ls":

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

Renderlo eseguibile e raggiungibile, naturalmente: chmod a+x git-ls; sudo cp git-ls /usr/local/bin. Ora, eseguilo come desideri:

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

Sappi anche che esiste git instawebun'utilità per i tuoi file locali. Avere la capacità di mostrare file e avere un server del genere, a mio parere, non distrugge nessuna delle caratteristiche decentralizzate intrinseche di git.


Non ottengo alcun risultato con questo. curl non sembra restituire nulla.
Matthew Read

Ora consiglierei sicuramente il metodo api di Anarug. Questo metodo funziona ancora:curl -s https://github.com/Itseez/opencv | grep js-directory-link | sed 's|.* title="\(.*\)".*|\1|'
Anne van Rossum

-1

se conosci il ramo remoto che vuoi controllare, puoi trovare le ultime tramite:

git ls-tree -r <remote_branch> --name-only

8
non funziona se non si clona il repository in precedenza :(
Bálint Szigeti,
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.