2014-12-01 14 views
5

Potrzebuję sklonować repozytorium git w Javie. Używam jGit.jgit - Usuń katalog .git (lub pobierz pliki bez niego)

Linia kodu używam jest:

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

Gdzie URIofRepo jest: Link GitHub do mojego repo i Gdzie localPath jest: katalog Chcę klon wydarzy.

To działa idealnie. Ponieważ jednak korzystanie z projektu, który robię, nie wymaga klonowania do dalszej pracy, po prostu chcę, aby klon miał zawartość repozytorium github BEZ katalogu .git.

Próbowałem też stosując następujący:

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

Jednak mam wyjątek IO mówiąc, nie jestem w stanie usunąć plik następująco:

wyjątek w wątku „main” java.io .IOException: Nie można usunąć pliku: C : \ testy \ testRepo1.git \ objects \ Pack \ pack-7ca7f11688adda065d62f3394d0e055346beff22.pack

+0

zawsze można utrzymać gołe, kopii lustrzanej (która pozwoli nie sklonować za każdym razem) i używać odpowiednika jgit dotyczącą 'git archive' – fge

Odpowiedz

5

It jest możliwe, że obecny proces zaćmienia zachowuje uchwyt pliku pakietu, uniemożliwiając jego usunięcie.
Jak Rüdiger Herrmann sugeruje in the comments:

Jeśli uchwyt plik jest otwarty, co zapobiega plik przed usunięciem, należy zamknąć repozytorium, który jest zwracany przez init:

clone.getRepository().close() 

Innym podejściem byłoby pobrać archiwum repozytorium GitHub poprzez its archive link.

Lub używając JGit, aby utworzyć archiwum z bieżącego lokalnego repozytorium (patrz ArchiveTest.java) i rozpakować archiwum do użycia.

+0

Jeśli uchwyt plik jest otwarty, co zapobiega plik przed usunięciem upewnić aby zamknąć repozytorium zwrócone przez init: 'clone.getRepository(). close()'. –

+0

@ RüdigerHerrmann dobry punkt. Zawarłem to w odpowiedzi, aby uzyskać lepszą widoczność. – VonC

+0

Dzięki! :) Dokładnie to, czego szukałem! – Slippy

0

To, czy efekt .close() będzie miał wpływ, zależy od tego, w jaki sposób utworzono repozytorium. Więc nawet jeśli wywołujesz zamknięcie instancji Git, może ona zwolnić zasoby. Zmarnowałem tak wiele czasu, zanim zdałem sobie z tego sprawę.

Z dokumentacji Jgit:

Jeśli repozytorium został otwarty przez statycznej metody fabryki w tej klasie, to metoda ta nazywa Repository.close() na podstawowej repozytorium instancji. (Niezależnie od tego, czy faktycznie udostępniane są podstawowe zasoby, takie jak uchwyty plików, mogą się różnić, zobacz Repozytorium, aby uzyskać więcej szczegółów.)

Jeśli repozytorium zostało utworzone przez wywołującego i przeszło do Git (repozytorium) lub statycznej metody fabrycznej w tej klasie , , wówczas ta metoda nie wywołuje zamknięcia w bazowym repozytorium.

1

Ta kwestia nie może usunąć z lokalnym repozytorium nadal utrzymywały się nawet po wykonaniu następujących czynności:

clone.getRepository().close() 

mogę rozwiązać ten problem i skutecznie usuwać lokalne repozytorium po ustawieniu „Opcje” wartość do rekurencyjnego usunięcia podczas wywoływania delete () w następujący sposób:

FileUtils.deleteDirectory(dirToDelete, 1); 

to co delete() dokument mówi:

public static void delete (F File, int opcje) wyrzuca IOException Usuń plik lub folder

Parametry: f - Plik ma zostać usunięty

opcje - opcje skreślenie, rekurencyjnych dla rekurencyjnego usunięciem poddrzewa, spróbuj ponownie ponowić próbę, gdy usunięcie nie powiodło się. Ponowna próba może pomóc, jeśli podstawowy system plików nie pozwoli na usunięcie plików odczytanych przez inny wątek.