8

tl; JGit博士在命令行工作正常checkout时抛出异常git checkout

我目前正在尝试使用 JGit 从 Java 中的在线 Git 存储库中检查某些修订(用于工作)。我目前的方法是(我对 Git 很陌生,来自 SVN 背景,所以这可能是错误的):

  • 将存储库克隆到我硬盘上的临时位置
  • 找出我想要的版本,(我尝试使用 SHA-1 哈希以及分支名称)
  • 签出该修订版
  • 从那里,我将使用签出的文件作为程序稍后部分的输入。
  • 签出不同的修订
  • 使用这些文件作为程序另一部分的输入

本质上,我希望能够将我的临时文件夹的内容与任何修订版交换。使用命令行界面,我已经能够使用git checkout masterand来执行此操作git checkout dylanbranch(其中 dylanbranch 是我在自己的克隆上创建的一个分支,带有任意选择的修订版),但是我尝试执行相同操作的 Java 代码失败了:

Git git = Git.open(new File("checkout")); //checkout is the folder with .git
git.checkout().setName("master").call(); //succeeds
git.checkout().setName("dylanbranch").call(); //fails

并将异常打印到控制台:

Exception in thread "main" org.eclipse.jgit.api.errors.JGitInternalException: Checkout conflict with files: 
src/sizzle
test/qunit
    at org.eclipse.jgit.api.CheckoutCommand.call(CheckoutCommand.java:211)
    at com.avi.scm.git.BranchCheckout.main(BranchCheckout.java:30)
Caused by: org.eclipse.jgit.errors.CheckoutConflictException: Checkout conflict with files: 
src/sizzle
test/qunit
    at org.eclipse.jgit.dircache.DirCacheCheckout.checkout(DirCacheCheckout.java:387)
    at org.eclipse.jgit.api.CheckoutCommand.call(CheckoutCommand.java:162)
    ... 1 more

我可以验证有问题的文件是否被标记为已删除并且没有通过使用暂存以进行提交,git status尽管我不确定为什么这些更改存在,并且只要我切换回 master 分支,它们就会回来。尽管如此,我仍然可以使用命令行 Git 成功更改工作树。

所以我的问题是:当命令行 git 可以时,为什么 JGit 不能用于此应用程序?感谢任何其他有用的信息-教育我:)

更新我一直在使用 jQuery 存储库进行测试,并注意到 JGit 的更多问题:当我使用“master”分支时,git status我觉得我是#On branch master并且有nothing to commit (working directory clean),但是使用 JGit 的状态命令我看到那test/qunitsrc/sizzle被标记为Missing。JGit 的重置似乎什么也没做。

4

3 回答 3

2

堆栈跟踪中提到的两个目录是Git 子模块(test/qunitsrc/sizzle),这很可能是问题的原因,因为 JGit 还没有完整的子模块支持。

这在本月发布的 1.1 JGit 版本中可能会有所不同,基于此提交

您可以在此处阅读有关 JGit 子模块支持的当前状态的更多信息。

于 2011-09-20T21:56:37.823 回答
0

我知道这并不能直接回答您的问题,但我也遇到了 Git 的 Java 实现问题。对我来说最有效的是简单地放弃 java 实现,并从应用程序中执行对 git 的命令行调用。它可能并不理想,但它会完全按照您的意愿行事,因为您将完全控制该命令。

只需调用 Runtime.getRuntime().exec(...)

链接到运行时类的 Javadoc

于 2011-09-16T17:49:54.633 回答
0

我在结帐时遇到了类似的问题。我认为您可以在 Git 中使用非暂存内容切换分支这一事实实际上是一种容忍,而不是一种特性。JGit 在全局上不如 Git 那样宽容,所以你通常应该测试很多情况。

似乎这不是您的问题(与子模块有关),但对于更一般的情况,您可能希望在使用 checkout 切换到另一个分支之前提交您的更改。

请注意,CheckoutCommand 非常适合我从旧版本开始新分支(您必须设置分支的名称和开始版本)。

于 2011-11-17T18:16:00.150 回答