2011-09-16 117 views
8

TL;博士 JGit的checkout拋出異常,同時命令行git checkout工作正常JGit結帳VS'混帳checkout`問題

我目前正試圖用JGit從在線Git倉庫檢查了一定的修改,在Java(用於工作)。我目前的做法是(我很新的混帳,從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會? 任何其他有用的信息appreciated-教育我:)

更新我一直用的jQuery庫測試,並已經注意到了其他幾個問題與JGit:當我用「master」分支工作, git status我認爲我是#On branch master並且有nothing to commit (working directory clean),但是使用JGit的狀態命令我看到test/qunitsrc/sizzle被標記爲Missing。 JGit的重置似乎什麼都不做。

回答

2

在堆棧跟蹤中提到的兩個目錄是Git submodulestest/qunitsrc/sizzle),這是最有可能的,因爲JGit問題的原因不具有完全的子模塊支持還。

根據這個commit,這可能在本月發佈的1.1 JGit版本中有不同的功能。

您可以閱讀更多關於JGit子模塊支持的當前狀態here

+0

感謝您的鏈接,+1 對於其他人試圖做同樣的事情,我目前的攻擊計劃是提交JGit看到的「變化」,以便我可以檢查其他事情。 (基本上忽略子模塊,就像JGit) – Dylan

+0

你可以試試JGit版本[這裏](https://hudson.eclipse.org/hudson/job/jgit/855/artifact/org.eclipse.jgit.packaging/org。 eclipse.jgit.updatesite/target/site/plugins/org.eclipse.jgit_1.2.0.201109151733.jar),看看你是否得到相同的衝突異常? –

+0

新版本確實解決了我的問題(儘管當您嘗試覆蓋/更新現有克隆時,克隆命令現在會中斷)。 – Dylan

0

我知道這不是直接回答你的問題,但我也有Git的Java實現的問題。最適合我的是簡單地拋棄java實現,並在應用程序中執行git的命令行調用。它可能不是理想的,但它會完全按照你想要的完成,因爲你完全可以控制命令。

直接讓 Runtime.getRuntime().exec(...)

Link to Javadoc for Runtime class

+1

我同意,運行時的事情將我自己的系統上工作,但我們不能保證用戶將有'在其系統上git'可用,我希望避免不得不distrubute與操作系統相關的二進制文件。 – Dylan

0

我有一個類似的問題,結帳。我認爲你可以在Git中使用未分離的內容來切換分支,這實際上是一種寬容,而不是一種特性。 JGit不像Git那麼寬容,所以你通常應該測試很多情況。

現在看來,這是不能直接您的問題(這是關係到子模塊),但更普遍的情況下,你會想使用Google Checkout切換到另一分支之前提交更改。

注意,CheckoutCommand完美的作品對我來說,從舊版本開始一個新的分支(你必須設置分支機構的名稱,並開始版本)。