2017-02-16 78 views
0

我的目標是以編程方式執行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時,它會爲您處理子進程輸入和輸出。然而,您不能像操作系統那樣執行此操作。

回答

0

我想出了一個窮人的解決方案。它將在系統控制檯窗口中運行,但至少可以從GUI應用程序啓動它。

終於作品混合物是這樣的:

1)創建一個Windows批處理文件(稱之爲 「temp.bat」),其中包含的命令:

git push origin master 

2)啓動CMD.EXE作爲一個進程和其標準輸入寫入以下行:

start temp.bat 

這將打開一個控制檯窗口並啓動git push。身份驗證將被正確處理,系統會提示您輸入密碼,並可以在控制檯窗口中輸入密碼。

其他版本不起作用。例如'start git.exe'不會打開一個新的控制檯窗口。

0

您可以使用Scala sys.process API。

import sys.process._ 

val statusCode = "git push origin master" ! // one ! for the statusCode 

或者:

val commandOutput "git push origin master" !! // two ! for getting the output 
+0

不幸的是,被刪除了類似的回答。我詳細評論了這個答案。我不會冒險再次失去長時間的評論,所以我在你的回答中評論你的問題。 – sbtpr