JGit checkout vs`git checkout`问题

时间:2011-09-16 15:36:10

标签: java git jgit

tl; dr 当命令行checkout正常工作时,JGit的git checkout会抛出异常

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

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

基本上,我希望能够将temp文件夹的内容与任何修订版交换。使用命令行界面,我已经能够使用git checkout mastergit 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的一些问题:当我使用“master”分支时,git status让我知道我是#On branch master并且有nothing to commit (working directory clean),但是使用JGit的状态命令,我看到test/qunitsrc/sizzle被标记为Missing。 JGit的重置似乎无能为力。

3 个答案:

答案 0 :(得分:2)

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

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

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

答案 1 :(得分:0)

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

只需致电 Runtime.getRuntime().exec(...)

Link to Javadoc for Runtime class

答案 2 :(得分:0)

我在Checkout遇到了类似的问题。我认为您可以在Git中使用非分段内容切换分支的事实实际上是容差,而不是功能。 JGit在全球范围内不像Git那样宽容,所以你通常应该测试很多案例。

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

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