2010-09-04 5 views
5

C'è un modo per scaricare a livello di programmazione un singolo file da un repository git remoto, in Java?Ottieni un singolo file da un repository git remoto

  1. Preferisco una soluzione che utilizzi la larghezza di banda minima possibile, preferibilmente solo scaricando quel singolo file. Non ho bisogno di sfogliare il repository, ho già il percorso del file.
  2. Preferisco una soluzione che non dipenda da altre applicazioni (ad esempio un'installazione di un altro client Git sulla macchina). Una libreria Java che contiene un'implementazione del client git stessa sarebbe ottimale.

sono stato in grado di fare qualcosa di simile con Subversion utilizzando SVNKit e ho visto c'è una pura implementazione Java di git (eclipse's JGit), che potrebbe essere in grado di fare qualcosa di simile, quindi spero che ci sia una risposta positiva ; anche se da quello che capisco su come funziona git - permettendo aggiornamenti solo da repository locali - questo potrebbe rivelarsi problematico.

+0

Da quello che ho capito, jgit sta ancora lavorando per fornire tutte le funzionalità di git - è improbabile che fornisca le funzionalità di git no. – Cascabel

+0

Non penso che ciò sia possibile nel caso generale, cioè dove si ha accesso solo attraverso il protocollo git. Non credo che i normali meccanismi di trasporto forniscano un modo per accedere a singoli file. Sono abbastanza sicuro che dovrai installare qualcosa sul telecomando (ad es. Gitweb) o ottenere l'accesso al filesystem a un repository (clone remoto o locale, forse superficiale). – Cascabel

risposta

8

git non è veramente progettato per l'accesso a file singolo da un repository remoto ma è possibile abusare di git archive per questo. Il rovescio della medaglia è che devi scaricare un "albero" anziché solo il blob di cui hai bisogno.

E.g.

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

In alternativa, se avete gitweb impostato sul repository remoto è possibile utilizzare un ricciolo semplice o comando wget di scaricare qualsiasi file nel suo formato "raw".

+0

Questo è un fantastico kludge. – Cascabel

+2

Si noti che per il protocollo 'git: //' si ha, da quello che ricordo, abilitare esplicitamente il servizio appropriato per consentire l'accesso remoto 'git archive'. –

+0

cos'è 'percorso/a/dir'? –

0

Disse git-clone(1):

--depth profondità

creare un clone superficiale con una storia troncato al specificato numero di revisioni. Un repository poco profondo ha un numero di limitazioni (non è possibile clonarlo o recuperarlo, né premere da né in esso), ma è adeguato se si è interessati solo alla cronologia recente di recente di un progetto di grandi dimensioni con una lunga storia e vorrebbe scrivere come patch.

Quindi la granularità è una directory ma è possibile limitare la cronologia delle revisioni.

+1

Si potrebbe anche usare '--no-checkout' per evitare di creare l'intera directory di lavoro. Nessun effetto di larghezza di banda, ma consente di risparmiare un sacco di creazione di file. – Cascabel

3

Che tipo di accesso è necessario al repository remoto? È tramite SSH, puoi chiamare i comandi? Se è così, puoi semplicemente invocare git show HEAD:$path_to_file.

Se non è possibile richiamare comandi su quella macchina, è ancora del tutto possibile farlo, ma è necessario comprendere il formato del repository Git. (Questo è molto meno pauroso di quanto sembri, dal momento che è molto semplice dal design.A differenza di Subversion, il formato del repository non è inteso come una scatola nera.)

+0

Se è possibile eseguire gitweb sul telecomando, è possibile farlo anche attraverso questo. – Cascabel