2017-02-16 17 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.

Каков выход из этого?

Edit:

Я пытаюсь сделать это с JavaFX на основе применения Scala, а не из программы консоли Scala.

Edit2:

Использование SYS апи здесь не решает проблему. Если вы попытаетесь выполнить gith-push через sys-api-вызов, то могут произойти две вещи:

Если подключение к Интернету отсутствует, оно выведет сообщение об ошибке в окне консоли приложения gui (у него есть один, если вы запустите это с запуском sbt).

Это интернет-соединение, после чего оно ничего не будет печатать, и вы не сможете выполнить аутентификацию. Процесс просто отделяется и становится недоступным для вас.

Дело в том, что git.exe, похоже, запускает подпроцесс, и у вас нет доступа к этому подпроцессу. Эта проблема особенная для Windows, на которую я дал ссылку в вопросе. Когда вы запускаете git в окне консоли Windows, тогда он заботится о входе и выходе подпроцессов для вас. Однако вы не находитесь в том же положении, что и операционная система.

ответ

0

Я придумал решение бедного человека. Он будет запускаться в окне системной консоли, но по крайней мере его можно запустить из приложения gui.

Смесь, которая, наконец, работает следующим образом:

1) Создайте пакетный файл для Windows (назовем его "temp.bat"), который содержит команду:

git push origin master 

2) Запустите cmd.exe в качестве процесса и его стандартного ввода введите следующую строку:

start temp.bat 

Это откроет окно консоли и запустит git push.Проверка подлинности будет выполнена правильно, вам будет предложено ввести пароль и ввести его в окне консоли.

Другие версии не работают. Например, «start git.exe» не откроет новое окно консоли.

0

Вы можете использовать API-интерфейс Scala sys.process.

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