2012-10-03 68 views
2

我爲git可執行文件創建了一個簡單的Java包裝,我想在我的應用程序中使用它。 一個小的代碼示例:git java wrapper - git pull never ends

public static void main(String[] args) { 
     String gitpath = "C:/eclipse/git/bin/git.exe"; 
     File folder = new File("C:/eclipse/teste/ssadasd"); 
     try { 
      folder.mkdirs(); 
      Runtime.getRuntime().exec(
        gitpath + " clone [email protected]:test.git", null, 
        folder); 
     } catch (IOException e) { 
      e.printStackTrace(); 
     } 
    } 

的代碼根本不會結束執行..好像它已經引起了內部exec。 如果我通過命令行運行git clone,它按預期工作。 如果我從github嘗試另一個存儲庫,例如它也可以。

有人對這裏發生的事情有所瞭解嗎? 在此先感謝

+1

我知道這並不解決您的問題,但使用JGit可能比從頭創建一個包裝簡單:http://eclipse.org/jgit/ – jcern

回答

2

這不是直接回答你的問題,但你可能想看看JGit,它是Git操作的直接Java實現(不包裝命令行git)。 JGit獲得了大量的使用和穩定工作,因爲它是EGit(Eclipse Git集成)的基礎。

+0

我不能做一個淺層克隆與jgit .. – caarlos0

+0

我會盡力它... http://stackoverflow.com/questions/12734760/jgit-how-對附加全部文件到臨時區域 – caarlos0

2

Runtime.getRuntime().exec返回一個Process對象,您可以使用該對象與流程交互並查看發生了什麼。我的猜測是,您需要做的僅僅是這樣的:

Process p = Runtime.getRuntime().exec(
    gitpath + " clone [email protected]:test.git", null, 
    folder); 
p.waitFor(); 

如果沒有,你也可以做getErrorStream()getOutputStream()的過程,看看它寫出;這可能有助於調試。

+0

它不工作..獲取輸出流只能說明我'克隆到'測試'...' – caarlos0

1

Runtime.exec()可引起各種情況下掛 - 見this article它引用的是Javadoc,它說(在JDK 7):

由於某些本地平臺只提供用於標準輸入和輸出流,故障有限緩衝區大小要及時寫輸入 流或讀取子流程的輸出流可能會導致 子流程阻塞,甚至死鎖。

文章給出了一些例子的解決方案,它消耗的輸出和錯誤流,但我認爲文章寫後推出的ProcessBuilder類,這樣可能會更令人滿意:較新的Javadoc補充說:

如果需要,subprocess I/O can also be redirected使用ProcessBuilder類的方法。