JGit通过.git-file连接到单独的git存储库

问题描述

我使用了// swift-tools-version:5.2 import PackageDescription let package = Package( name: "decryp",dependencies: [ .package(url: "https://github.com/apple/swift-crypto.git",.upToNextMajor(from: "1.0.1")) ],targets: [ .target( name: "decryp",dependencies: [ .product(name: "Crypto",package: "swift-crypto") ] ),.testTarget( name: "decrypTests",dependencies: ["decryp"]),] ) 并为存储库定义了另一个位置。 我的工作地点是"git init --separate-git-dir=C:/repo/.git"

git在工作位置创建了一个"C:/work/"链接到回购位置。

当我使用JGit时,我无法连接到我的仓库:

.git-file

然后我得到一个例外:


Git
   .open(new File("C:\\work\\.git"))
   .reset()
   .setMode(ResetType.HARD)
   .call();

如何连接到我的存储库?

感谢帮助。

编辑:

感谢乔尼(Joni)为我的问题找到了解决方案。

谢谢乔妮!你太棒了!我像你写的那样尝试了 设置工作树,它就像一个魅力。顺便说一句我发现 一个执行此步骤的选项,而无需知道回购位置在哪里。 对于那些感兴趣的人:

Exception in thread "main" org.eclipse.jgit.errors.RepositoryNotFoundException: repository not found: C:\work\.git
    at org.eclipse.jgit.lib.BaseRepositoryBuilder.build(BaseRepositoryBuilder.java:582)
    at org.eclipse.jgit.api.Git.open(Git.java:117)
    at org.eclipse.jgit.api.Git.open(Git.java:99)
    at de.test.git.App.main(App.java:20)

解决方法

JGit似乎还不支持--separate-git-dir选项。

作为解决方法,您可以直接打开链接的存储库:

Git
   .open(new File("C:/repo/.git"))
   .reset()
   .setMode(ResetType.HARD)
   .call();

以这种方式使用时,JGit不会知道您的工作目录在哪里,因此我认为与工作目录有关的任何操作都会失败。通过the user guide,您可以创建一个自定义的Repository对象,如下所示:

FileRepositoryBuilder builder = new FileRepositoryBuilder();
Repository repository = builder.setGitDir(new File("C:/repo/.git"))
  .setWorkTree(new File("C:/work"))
  .readEnvironment() // scan environment GIT_* variables
  .build();

然后使用Git(Repository)构造函数而不是Git.open

Git git = new Git(repository);
git.reset()
   .setMode(ResetType.HARD)
   .call();