2014-12-01 17 views
5

Ho bisogno di clonare un repository git in java. Sto usando jGit.jgit - Elimina la directory .git (o scarica file senza)

La riga di codice che sto usando è:

Git clone = Git.cloneRepository().setURI(URIofRepo).setDirectory(localPath).call(); 

Dove URIofRepo è: il link GitHub al mio repo e Dove localPath è: la directory che voglio il clone accada.

Questo funziona perfettamente. Tuttavia, poiché l'utilizzo del progetto che sto facendo non richiede un clone per il lavoro continuo, voglio semplicemente che il clone abbia il contenuto del repo github SENZA la directory .git.

ho provato anche utilizzando la seguente:

File dirToDelete = new File (path + "/.git"); 
    FileUtils.deleteDirectory(dirToDelete); 

Comunque ho ottenuto un'eccezione IO dicendo che io sono in grado di eliminare il file come segue:

Exception in thread java.io "principale" .IOException: Impossibile eliminare il file: C: \ test \ testRepo1.git \ oggetti \ pacchetto \ pacchetto-7ca7f11688adda065d62f3394d0e055346beff22.pack

+0

È sempre possibile mantenere una nuda, copia speculare (che permetterà di non clonare ogni volta) e utilizzare equivalente di jgit di 'git archive' – fge

risposta

5

E ' è possibile che l'attuale processo di eclissi mantenga un handle sul file pack, impedendone l'eliminazione.
Come Rüdiger Herrmann suggerisce in the comments:

Se l'handle di file aperto è ciò che impedisce che il file venga cancellato, assicurarsi di chiudere il repository che viene restituito dalla init:

clone.getRepository().close() 

Un altro approccio sarebbe quello di scaricare un archivio del repository GitHub tramite its archive link.

Oppure utilizzare JGit per creare un archivio dal repository locale corrente (vedere ArchiveTest.java) e decomprimere tale archivio per l'utente.

+0

Se l'handle di file aperto è ciò che impedisce che il file venga cancellato, assicurarsi per chiudere il repository restituito da init: 'clone.getRepository(). close()'. –

+0

@ RüdigerHerrmann buon punto. L'ho incluso nella risposta per maggiore visibilità. – VonC

+0

Grazie! :) Esattamente quello che stavo cercando! – Slippy

0

Se il tuo file .close() avrà un effetto dipende da come è stato creato il repository. Quindi, anche se stai chiamando da vicino su un'istanza Git, potrebbe o meno liberare le risorse. Ho sprecato così tanto del mio tempo prima che me ne rendessi conto.

Da documentazione Jgit:

Se il repository è stato aperto da un metodo factory statica in questa classe, questo metodo chiama Repository.close() nell'istanza repository sottostante. (Se questo effettivamente rilascia risorse sottostanti, come gli handle di file, può variare: vedi Repository per ulteriori dettagli.)

Se il repository è stato creato da un chiamante e passato in Git (repository) o un metodo factory statico in questa classe , quindi questo metodo non chiama close sul repository sottostante.

1

Questo numero di grado di eliminare repository locale persisteva anche dopo aver provato seguente:

clone.getRepository().close() 

ho potuto risolvere il problema e con successo eliminare repository locale dopo aver impostato "opzioni" valore alla cancellazione ricorsiva durante la chiamata delete () come segue:

FileUtils.deleteDirectory(dirToDelete, 1); 

Questo è ciò che delete() documento dice:

public static void delete (f file, opzioni INT) throws IOException Elimina file o una cartella

Parametri: f - file da eliminare

opzioni - opzioni di eliminazione, ricorsivo per la cancellazione ricorsiva di una sottostruttura, RIPROVA riprovare quando la cancellazione non è riuscita. Riprovare può aiutare se il file system sottostante non consente la cancellazione dei file letti da un altro thread.

Problemi correlati