2017-02-16 3 views
0

Mein Ziel ist es, git push programmatisch statt von einem Konsolenfenster aus durchzuführen.Wie kann ich git push innerhalb eines Prozesses durchführen?

Zu diesem Zweck erstelle ich einen Prozess wie:

val processbuilder=new ProcessBuilder(List("git.exe","push","origin","master").asJava) 
process=processbuilder.start() 

Nun, das Problem ist, dass git.exe scheint einen anderen Prozess zu starten, mit dem Ausgang/Fehlern und Eingabe von denen ich keinen Zugang habe. Ich weiß das, denn wenn ich es ohne Internetverbindung starte, druckt es nur eine Nachricht auf der Fehlerausgabe und beendet, wie es sollte. Wenn ich jedoch dasselbe mit einer Internetverbindung mache, druckt es nichts auf seiner Standardausgabe/-fehler. Außerdem kann ich den Prozess in diesem Fall nicht zerstören (siehe: http://bugs.java.com/bugdatabase/view_bug.do?bug_id=4770092), was darauf hindeutet, dass die Authentifizierung in einem separaten Prozess stattfindet, der von git.exe erstellt wird und auf den ich keinen Zugriff habe.

Ich habe versucht, dies zu umgehen, indem ich cmd.exe als ein Prozess starten und git push als Befehl ausgeben, aber auch in diesem Fall hat das Schreiben des Passworts auf die Standardeingabe von cmd.exe keinen Effekt.

Die Plattform, die ich verwende, ist Windows 10 + Scala sbt.

Was ist der Ausweg?

bearbeitet:

Ich versuche, dies aus einer JavaFX basierten Scala Anwendung zu tun, anstatt von einer Konsole Scala-Programm.

EDIT2:

Benutzung des sys api hier das Problem nicht lösen. Wenn Sie versuchen, den Gith-Push-Sys-API-Anruf auszuführen, können zwei Dinge passieren:

Wenn es keine Internetverbindung gibt, wird eine Fehlermeldung auf dem Konsolenfenster der GUI-Anwendung (es hat eine, wenn Sie ausgeführt werden es mit sbt run).

Es gibt eine Internetverbindung, dann wird nichts gedruckt und Sie können die Authentifizierung nicht durchführen. Der Prozess löst sich einfach und wird für Sie unerreichbar.

Der Punkt ist, dass git.exe scheint, einen Subprozess zu starten, und Sie haben keinen Zugriff auf diesen Subprozess. Dies ist ein Problem für Windows, auf das ich einen Link in der Frage gab. Wenn Sie git im Windows-Konsolenfenster ausführen, kümmert es sich um die Eingabe und Ausgabe der Unterprozesse für Sie. Sie sind jedoch nicht in der gleichen Position wie das Betriebssystem, um dies zu tun.

Antwort

0

Ich kam mit einer armen Mannes Lösung. Es wird in einem Systemkonsolenfenster ausgeführt, aber es kann zumindest von der GUI-App gestartet werden.

Die Mischung, die schließlich funktioniert, ist dies:

1) Erstellen Sie eine Datei Windows-Batch (nennen wir es "temp.bat"), die den Befehl enthält:

git push origin master 

2) Starten Sie cmd.exe Schreiben Sie als Prozess und als Standardeingabe die folgende Zeile:

start temp.bat 

Dies öffnet ein Konsolenfenster und initiiert den Git-Push.Die Authentifizierung wird ordnungsgemäß gehandhabt, Sie werden nach dem Kennwort gefragt und können es im Konsolenfenster eingeben.

Andere Versionen funktionieren nicht. Zum Beispiel wird 'start git.exe' kein neues Konsolenfenster öffnen.

0

Sie können Scala sys.process API verwenden.

import sys.process._ 

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

Oder:

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

Leider gab es eine ähnliche Antwort, die gelöscht wurde. Ich habe diese Antwort ausführlich kommentiert. Ich werde nicht riskieren, einen langen Kommentar noch einmal zu verlieren, also kommentiere ich Ihre Antwort in der Frage. – sbtpr

Verwandte Themen