繁体   English   中英

jgit - 删除.git目录(或获取没有它的文件)

[英]jgit - Delete .git directory (or get files without it)

我需要在java中克隆一个git repo。 我正在使用jGit。

我正在使用的代码行是:

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

其中URIofRepo是:我的repo的github链接和localPath的位置:我希望克隆发生的目录。

这非常有效。 但是,由于我正在使用的项目不需要克隆继续工作,我只是希望克隆具有github repo的内容而没有.git目录。

我也试过使用以下内容:

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

但是我得到一个IO异常,说我无法删除该文件,如下所示:

线程“main”中的异常java.io.IOException:无法删除文件:C:\\ testing \\ testRepo1.git \\ objects \\ pack \\ pack-7ca7f11688adda065d62f3394d0e055346beff22.pack

当前的eclipse进程可能会对pack文件进行处理,从而阻止其删除。
正如RüdigerHerrmann 在评论中所说

如果打开文件句柄阻止文件被删除,请确保关闭init返回的存储库:

clone.getRepository().close()

另一种方法是通过其归档链接下载GitHub仓库的存档

或者使用JGit从当前本地存储库创建存档(请参阅ArchiveTest.java ),然后解压缩该存档以供您使用。

即使尝试以下后,此无法删除本地存储库的问题仍然存在:

clone.getRepository().close()

我可以修复问题并在调用delete()后将“options”值设置为RECURSIVE delete后成功删除本地存储库,如下所示:

 FileUtils.deleteDirectory(dirToDelete, 1);

这就是delete()文档所说的:

public static void delete(File f,int options)throws IOException删除文件或文件夹

参数:f - 要删除的文件

options - 删除选项,RECURSIVE用于递归删除子树,RETRY在删除失败时重试。 如果基础文件系统不允许删除另一个线程正在读取的文件,则重试可能会有所帮助。

.close()是否具有效果取决于存储库的创建方式。 因此,即使您在Git实例上调用close,它也可能会释放资源。 在我意识到这一点之前,我浪费了很多时间。

来自Jgit文档:

如果存储库是由此类中静态工厂方法打开的,则此方法将在底层存储库实例上调用Repository.close() (这实际上是否释放了底层资源,例如文件句柄,可能会有所不同;有关详细信息,请参阅存储库。)

如果存储库是由调用者创建并传递到此类中的Git(存储库)或静态工厂方法, 则此方法不会在底层存储库上调用close。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM