Java JGit签出与“git签出”问题

Java JGit签出与“git签出”问题,java,git,jgit,Java,Git,Jgit,tl;drJGit的checkout抛出异常,而命令行git checkout工作正常 我目前正试图使用JGit从在线Git存储库中以Java(用于工作)检查某些修订。我目前的方法是(我对Git非常陌生,来自SVN背景,所以这可能是错误的): 将存储库克隆到硬盘上的临时位置 找出我想要的版本(我已经尝试使用SHA-1散列以及分支的名称) 签出该修订 从那里,我将使用签出的文件作为程序后面部分的输入 签出其他修订 将这些文件用作程序另一部分的输入 基本上,我希望能够将临时文件夹的内容与任何版本

tl;drJGit的
checkout
抛出异常,而命令行
git checkout
工作正常

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

  • 将存储库克隆到硬盘上的临时位置
  • 找出我想要的版本(我已经尝试使用SHA-1散列以及分支的名称)
  • 签出该修订
  • 从那里,我将使用签出的文件作为程序后面部分的输入
  • 签出其他修订
  • 将这些文件用作程序另一部分的输入
基本上,我希望能够将临时文件夹的内容与任何版本交换。通过命令行界面,我已经能够使用
git checkout master
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
验证有问题的文件是否标记为已删除且未暂存以进行提交,尽管我不确定为什么会有这些更改,并且在我切换回主分支时它们会返回。尽管如此,我仍然可以使用命令行Git成功地更改工作树

那么我的问题是:为什么JGit不能在这个应用程序中工作,而命令行git可以? 任何其他有用的信息都将不胜感激-教育我:)

更新我一直在使用jQuery存储库进行测试,并注意到JGit还有一些问题:当我使用“主”分支时,
git状态告诉我我是分支主
,并且没有要提交的内容(工作目录清理),但是使用JGit的status命令,我看到
test/qunit
src/sizzle
被标记为
缺失
。JGit的重置似乎没有任何作用。

我知道这并不能直接回答您的问题,但我也遇到了Git的Java实现问题。对我来说,最有效的方法就是放弃java实现,在应用程序中执行对git的命令行调用。它可能并不理想,但它会完全满足您的要求,因为您可以完全控制命令

就叫
Runtime.getRuntime().exec(…)


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

基于此,本月即将发布的1.1 JGit版本可能会有不同的功能


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

我在签出时遇到了类似的问题。我认为,在Git中,可以使用未老化的内容切换分支实际上是一种容忍,而不是一种特性。 JGit在全球范围内不如Git那么宽容,因此您通常应该测试许多情况

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


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

我同意运行时功能可以在我自己的系统上运行,但我们不能保证用户的系统上会有
git
,我希望避免怀疑特定于操作系统的二进制文件。感谢这些链接,+1对于其他试图做同样事情的人,我目前的攻击计划是提交JGit看到的“更改”,以便我可以查看其他内容。(基本上忽略子模块,就像JGit一样)您可以尝试JGit版本,看看是否会出现相同的冲突异常吗?新版本确实解决了我的问题(尽管当您尝试覆盖/更新现有克隆时,克隆命令现在会中断)。实际上,我发现:它显示了如何在不需要签出的情况下获取文件的内容