Jgit抛出java.io.IOException:为/.config/jgit创建目录失败

flseospp  于 2023-06-20  发布在  Git
关注(0)|答案(3)|浏览(219)

最近将Jgit升级到5.10.0.202012080955-r。在此之后,我们将在克隆一个裸git存储库后获得IOException。到目前为止,它似乎没有造成任何可见的功能影响,但它是一个令人担忧的原因。此问题仅在Kubernetes部署中出现,而不是在Junit测试中出现。这是一个已知的问题吗?如果是,是否有任何变通方法或缺少任何内容?
谢谢

[36morg.eclipse.jgit.util.FS                [0;39m [2m:[0;39m Cannot save config file 'FileBasedConfig[/.config/jgit/config]'

java.io.IOException: Creating directories for /.config/jgit failed
    at org.eclipse.jgit.util.FileUtils.mkdirs(FileUtils.java:411) ~[org.eclipse.jgit-5.10.0.202012080955-r.jar!/:5.10.0.202012080955-r]
    at org.eclipse.jgit.internal.storage.file.LockFile.lock(LockFile.java:130) ~[org.eclipse.jgit-5.10.0.202012080955-r.jar!/:5.10.0.202012080955-r]
    at org.eclipse.jgit.storage.file.FileBasedConfig.save(FileBasedConfig.java:219) ~[org.eclipse.jgit-5.10.0.202012080955-r.jar!/:5.10.0.202012080955-r]
    at org.eclipse.jgit.util.FS$FileStoreAttributes.saveToConfig(FS.java:735) ~[org.eclipse.jgit-5.10.0.202012080955-r.jar!/:5.10.0.202012080955-r]
    at org.eclipse.jgit.util.FS$FileStoreAttributes.lambda$4(FS.java:424) ~[org.eclipse.jgit-5.10.0.202012080955-r.jar!/:5.10.0.202012080955-r]
    at org.eclipse.jgit.util.FS$FileStoreAttributes$$Lambda$1660/0x00000000f4008230.run(Unknown Source) ~[na:na]
    at java.base/java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1128) ~[na:na]
    at java.base/java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:628) ~[na:na]
    at java.base/java.lang.Thread.run(Thread.java:836) ~[na:na]
vql8enpb

vql8enpb1#

在本例中,Jgit试图在基于XDG_CONFIG_HOME的路径上创建一个配置文件。
如果未设置XDG_CONFIG_HOME,则它将具有默认值$HOME/.config。在我的Kubernetes环境中无法访问此特定路径。
更改XDG_CONFIG_HOME以指向适当的路径。因此Jgit将能够创建配置文件。

kognpnkq

kognpnkq2#

JGit不需要创建一个配置文件来运行。
但很明显,它确实存在:$HOME/.config/jgit/config,过去曾导致问题(对于IntelliJ或最近的2023年4月的Eclipse
而不需要使用环境变量?
这似乎是有问题的,除非,也许,如果你在JGit中实现了一个自定义的FS(文件系统)。
其中包括在JGit中子类化FS类来创建自己的自定义文件系统。

public class CustomFS extends FS {
    // Override methods as needed
}

当您通过FileRepositoryBuilder创建Repository时使用上述CustomFS,您可以在其中指定您的自定义FS

FileRepositoryBuilder builder = new FileRepositoryBuilder();
Repository repo = builder.setGitDir(new File("/path/to/repo"))
                         .setFS(new CustomFS())
                         .build();

这样,存储库将使用您的自定义FS,这可以防止在无法访问的目录中创建配置文件。
但这只有在不需要受限API的情况下才有效。
不过,可以使用环境变量更改HOMEXDG_CONFIG_HOME,以便测试.config/jgit/config的替代位置。
Eclipse JGit issue 582064中,Thomas Wolf补充道:
Git中的正常方式确实是环境变量。
在JGit中通过编程解决这个问题的常用方法是安装一个自定义的SystemReader,它覆盖一些变量,或者提供自定义的系统或全局配置。
目前,JGit有一些不一致的地方,这可能会使主目录很难做到这一点。我们正在慢慢地努力。
其中一部分应该在我为bug 436127推送的更改中得到修复;这应该可以让你有一个自定义的SystemReader,它返回getProperty("user.home")getenv("HOME")的自定义值,以便为JGit重新定义它。(或getenv("XDG_CONFIG_HOME")的自定义值。)
还有bug 581875,它是关于$XDG_CONFIG_HOME中的全局(用户)git config
对于在既没有定义$HOME也没有定义$XDG_CONFIG_HOME的容器中运行,并且没有主目录:在容器设置中,定义任一变量指向JGit具有写权限现有目录并不困难

azpvetkf

azpvetkf3#

设置XDG_CONFIG_HOME对我不起作用。我用的是windows机器,下面的东西对我有用。
在程序中传递下面的环境变量

HOMEDRIVE=C:;HOMEPATH=\Users\<YourUserName>

相关问题