我需要在java中克隆一个git repo。我正在使用jGit。
我正在使用的代码行是:
Git clone = Git.cloneRepository().setURI(URIofRepo).setDirectory(localPath).call();
URIofRepo是:我的仓库的github链接 和 localPath的位置是:我希望克隆发生的目录。
这完美无缺。但是,由于我正在使用的项目不需要克隆来继续工作,我只是希望克隆具有github repo的内容而没有.git目录。
我还尝试使用以下内容:
File dirToDelete = new File (path + "/.git");
FileUtils.deleteDirectory(dirToDelete);
但是我有一个IO异常,说我无法删除该文件,如下所示:
线程“main”中的异常java.io.IOException:无法删除文件: C:\测试\ testRepo1.git \对象\包\包-7ca7f11688adda065d62f3394d0e055346beff22.pack
答案 0 :(得分:5)
当前的eclipse进程可能会对包文件进行处理,从而阻止删除它 正如Rüdiger Herrmann建议in the comments:
如果打开文件句柄阻止文件被删除,请确保关闭
init
返回的存储库:
clone.getRepository().close()
另一种方法是通过its archive link下载GitHub仓库的档案。
或者使用JGit从当前本地仓库创建存档(请参阅ArchiveTest.java
),然后解压缩该存档以供您使用。
答案 1 :(得分:2)
即使尝试以下操作,此无法删除本地存储库的问题仍然存在:
clone.getRepository().close()
我可以解决问题并在调用delete()后将“options”值设置为RECURSIVE delete后成功删除本地存储库,如下所示:
FileUtils.deleteDirectory(dirToDelete, 1);
这就是delete()文档所说的内容:
public static void delete(File f,int options)抛出IOException 删除文件或文件夹
参数:f - 要删除的文件
选项 - 删除选项,RECURSIVE用于递归删除子树,RETRY在删除失败时重试。如果基础文件系统不允许删除另一个线程正在读取的文件,则重试可能会有所帮助。
答案 2 :(得分:0)
.close()是否会产生影响取决于存储库的创建方式。因此,即使您在Git实例上调用close,它也可能会释放资源。在我意识到这一点之前,我浪费了很多时间。
来自Jgit文档:
如果存储库是由此类中的静态工厂方法打开的,则此方法将在底层存储库实例上调用Repository.close()。 (这实际上是否释放了底层资源,例如文件句柄,可能会有所不同;有关详细信息,请参阅存储库。)
如果存储库是由调用者创建并传递到Git(存储库)或此类中的静态工厂方法,则此方法不会在底层存储库上调用close。