我的目标是以编程方式执行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