tl; dr 当命令行checkout
正常工作时,JGit的git checkout
会抛出异常
我目前正在尝试使用JGit从Java(用于工作)检查来自在线Git存储库的某些修订。我目前的方法是(我对Git很新,来自SVN背景,所以这可能是错的):
基本上,我希望能够将temp文件夹的内容与任何修订版交换。使用命令行界面,我已经能够使用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的一些问题:当我使用“master”分支时,git status
让我知道我是#On branch master
并且有nothing to commit (working directory clean)
,但是使用JGit的状态命令,我看到test/qunit
和src/sizzle
被标记为Missing
。 JGit的重置似乎无能为力。
答案 0 :(得分:2)
堆栈跟踪中提到的两个目录是Git submodules(test/qunit
和src/sizzle
),这很可能是问题的原因,因为JGit还没有完整的子模块支持。< / p>
这可能会在本月基于此commit发布的1.1 JGit版本中有所不同。
您可以阅读有关JGit子模块支持here的当前状态的更多信息。
答案 1 :(得分:0)
我知道这不是直接回答你的问题,但我也遇到了Git的Java实现问题。对我来说最有效的方法就是放弃java实现,并从应用程序中执行对git的命令行调用。它可能并不理想,但它会完全按照您的要求完成,因为您将完全控制命令。
只需致电
Runtime.getRuntime().exec(...)
答案 2 :(得分:0)
我在Checkout遇到了类似的问题。我认为您可以在Git中使用非分段内容切换分支的事实实际上是容差,而不是功能。 JGit在全球范围内不像Git那样宽容,所以你通常应该测试很多案例。
它似乎不是直接问题(与子模块有关),但对于更一般的情况,您可能希望在使用checkout切换到另一个分支之前提交更改。
请注意,CheckoutCommand非常适合我从旧版本启动新分支(您必须设置分支的名称和起始版本)。