繁体   English   中英

JGit checkout vs`git checkout`问题

[英]JGit checkout vs `git checkout` problems

tl; dr JGit的checkout引发异常,而命令行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来验证是否有问题的文件被标记为已删除,并且未暂存以提交,尽管我不确定为什么会有这些更改,并且只要我切换回master分支,它们就会回来。 尽管如此,我仍然可以使用命令行Git成功更改工作树。

所以我的问题是:当命令行git可以运行时,为什么JGit无法在该应用程序中工作? 任何其他有用的信息表示赞赏-教育我:)

更新我一直在使用jQuery存储库进行测试,并注意到JGit的其他一些问题:当我使用“ master”分支时, git status提示我我是#On branch master ,没有nothing to commit (working directory clean) #On branch master nothing to commit (working directory clean) ,但是使用JGit的status命令,我看到test/qunitsrc/sizzle被标记为Missing JGit的重置似乎无济于事。

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

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

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

我知道这并不能直接回答您的问题,但是Git的Java实现也遇到了问题。 对我而言,最有效的方法是简单地放弃Java实现,并从应用程序内部执行对git的命令行调用。 它可能并不理想,但是它将完全按照您的要求进行操作,因为您将完全控制该命令。

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

链接到Javadoc的Runtime类

我在Checkout遇到了类似的问题。 我认为,可以在Git中使用未暂存的内容切换分支的事实实际上是一个容忍度,而不是功能。 JGit在全球范围内不如Git宽容,因此您通常应该测试许多情况。

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

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

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM