2017-02-16 48 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