簡體   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