我的目標是以編程方式執行git push,而不是從控制檯窗口執行。如何在進程中執行git push?
爲了達到這個目的,我創建像一個過程:
val processbuilder=new ProcessBuilder(List("git.exe","push","origin","master").asJava)
process=processbuilder.start()
現在的問題是,git.exe似乎啓動其他程序,到輸出/錯誤輸入,而我都進不去。我知道這一點,因爲如果我在沒有互聯網連接的情況下運行它,它只會在錯誤輸出上打印一條消息並退出,因爲它應該如此。但是,如果我使用互聯網連接做同樣的事情,它不會在其標準輸出/錯誤上打印任何內容。在這種情況下,我也無法銷燬進程(請參閱:http://bugs.java.com/bugdatabase/view_bug.do?bug_id=4770092),這表示身份驗證發生在由git.exe創建且我無法訪問的單獨進程中。
我試圖通過啓動cmd.exe作爲一個進程來解決這個問題,併發出git push作爲命令,但是在這種情況下將密碼寫入cmd.exe的標準輸入沒有任何影響。
我使用的平臺是Windows 10 + Scala sbt。
這是什麼方法?
編輯:
我試圖從基於JavaFX的斯卡拉應用,而不是從一個控制檯斯卡拉程序做到這一點。
EDIT2:
使用sys API這裏不解決問題。如果您嘗試通過sys api調用執行gith push,則可能發生以下兩件事:
如果沒有互聯網連接,它將在gui應用程序的控制檯窗口中打印一條錯誤消息(它有一個,如果您運行它與sbt運行)。
它有一個互聯網連接,那麼它將不打印任何東西,你不能執行身份驗證。該過程簡單地分離並且變得對你無法訪問。
問題是,git.exe似乎啓動了一個子進程,並且您無法訪問此子進程。這是我在問題中給出鏈接的Windows特有的問題。當您在Windows控制檯窗口中運行git時,它會爲您處理子進程輸入和輸出。然而,您不能像操作系統那樣執行此操作。
不幸的是,被刪除了類似的回答。我詳細評論了這個答案。我不會冒險再次失去長時間的評論,所以我在你的回答中評論你的問題。 – sbtpr