2015-08-26 5 views
1

В настоящее время я разрабатываю приложение, которое клонирует репозитории Git благодаря JGit (http://wiki.eclipse.org/JGit/User_Guide) каждый раз, когда пользователь входит в систему. Когда пользователь хочет выйти из приложения, я хочу удалить клон. Вот и проблема: при клонировании репозитория создается папка .git, в которой можно найти файл .pack (.git/objects/pack/sutpideFile.pack) и который не может быть удален, поскольку платформа Java блокируется он (при попытке удалить его вручную, получите ошибку «Действие не может быть завершено, потому что файл открыт в Java (TM) Platform SE binary»).

ЭТО ЗНАТЬ ПРОБЛЕМА С Jgit: .pack file from git repo can't be deleted using File delete() method. Таким образом, я использовал предлагаемое здесь решение: https://github.com/ajoberstar/grgit/issues/33, которое должно добавить эти три строки до моего метода удаления:
WindowCacheConfig config = new WindowCacheConfig();
config.setPackedGitMMAP (true);
WindowCache.install (config);

Но что действительно беспокоит меня, потому что я не понимаю, что это решение работает только один раз: Я запускаю сервер (TomCat), подключение, а затем отключить. Здесь вся папка удаляется. Однако, когда я снова подключаюсь и отключается (без повторного запуска сервера), там восстает файл, и я больше не могу его удалять, пока не завершу работу сервера.

Есть ли у кого-нибудь слабая идея, почему это работает, но только один раз?Как удалить файл, заблокированный платформой Java?

Спасибо за вашу помощь,

EDIT:. Ну, так что я просто нужно добавить git.getRepository() близко();, когда я заканчиваю использовать объект Git. Тогда удаление возможно!

+0

Вы попробовали второе решение из вопроса, на который указали? т.е. http://stackoverflow.com/a/30184334/4807777 –

+0

Имеет ли ['File.deleteOnExit()'] (http://docs.oracle.com/javase/8/docs/api/java/io/File. html # deleteOnExit--) help? –

+0

@LaurentiuL. : yep, close(); уже пробовал! – Ekatsim

ответ

0

Это know bug in JGit см обсуждение на How do I release file system locks after cloning repo via JGit

В основном вы в настоящее время необходимо добавить вызов «Git.getRepository(). Близкий()» для того, чтобы бесплатно все файловой системы блокировки до новой версии от JGit.

result = Git.cloneRepository() 
     .setURI('https://github.com/github/testrepo.git') 
     .setDirectory(localPath) 
     .call(); 

// this is currently necessary to free all file locks 
result.getRepository().close(); 

result.close(); 

У JGit 4.1 планируется исправить это.

Смежные вопросы