jgit - 删除.git目录(或获取不包含.git目录的文件)

5
我需要在Java中克隆一个git仓库。我正在使用jGit。
我使用的代码行是:
Git clone = Git.cloneRepository().setURI(URIofRepo).setDirectory(localPath).call();

其中URIofRepo是我的仓库的Github链接, 而localPath是我想要克隆发生的目录。

这个方法非常完美。然而,由于我正在进行的项目不需要克隆来继续工作,我只想让克隆拥有Github仓库的内容,但不包括.git目录。

我也尝试使用以下方法:

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

然而,我遇到了一个IO异常,提示我无法删除文件,具体如下:

Exception in thread "main" java.io.IOException: Unable to delete file: C:\testing\testRepo1.git\objects\pack\pack-7ca7f11688adda065d62f3394d0e055346beff22.pack


你可以始终保持一个裸的、镜像的副本(这样就不需要每次都克隆),并使用jgit的等效命令git archive - fge
3个回答

5
当前的eclipse进程可能会持有pack文件的句柄,从而阻止其被删除。
Rüdiger Herrmann评论中所建议的那样:

如果打开的文件句柄是导致文件无法被删除的原因,请确保关闭由init返回的存储库:

clone.getRepository().close()

另一种方法是通过存档链接下载GitHub存储库的归档文件。
或者使用JGit从当前本地仓库创建一个归档(参见ArchiveTest.java),并解压该归档供您使用。

如果打开的文件句柄是导致文件无法删除的原因,请确保关闭由init返回的仓库:clone.getRepository().close() - Rüdiger Herrmann
@RüdigerHerrmann 很好的观点。我已经将其包含在答案中以增加可见性。 - VonC
谢谢! :) 正是我想要的! - Slippy

5
即使尝试以下方法,本地存储库仍然无法删除:

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用于在删除失败时重试。如果底层文件系统不允许删除正在被另一个线程读取的文件,则重试可能有所帮助。


1
是的,第二种方法解决了我的问题。应该从这个库中导入FileUtilsimport org.eclipse.jgit.util.FileUtils;而不是从这个库中导入: import org.apache.commons.io.FileUtils; - Muhammed_G

0

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

来自Jgit文档:

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

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


有什么想法可以克服这个问题吗? - codeforHarman

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接