Gibt es eine Möglichkeit, mit git mithilfe einer .NET-Anwendung zu arbeiten? [geschlossen]

69

Wie kann ich einen Ordner aus GitHub ziehen (vielleicht auch pushen )?

Ich meine, ich brauche API für .NET, um in C # zuzugreifen, nicht GUI für Git.

cnd
quelle
3
@ code4life - und alle anderen, die an Empfehlungen für Bibliotheken / Tools interessiert sind - checken Software Recommendations Stack Exchange .
Kenny Evitt

Antworten:

30

Ich habe gerade Folgendes gefunden: http://www.eqqon.com/index.php/GitSharp

GitSharp ist eine Implementierung von Git für das Dot.Net Framework und Mono. Es soll vollständig mit dem ursprünglichen Git kompatibel sein und soll eine leichte Bibliothek für coole Anwendungen sein, die auf Git als Objektdatenbank basieren oder Repositorys auf irgendeine Weise lesen oder bearbeiten ...

Daniel A. White
quelle
30
Wie auf dieser Seite erwähnt, haben sie die Entwicklung gestoppt, da libgit2sharp vielversprechender aussieht - github.com/libgit2/libgit2sharp
James Manning
1
Leider wird Pull im Oktober 2013 in libgit2sharp nicht vollständig unterstützt, da Pull = Fetch + Merge und Merge noch geschrieben werden müssen. Wird großartig sein, wenn es fertig ist! :-)
Russell Giddings
3
@ RussellGiddings Die Dinge haben sich seitdem etwas weiterentwickelt: Zusammenführen, Ziehen, Zurücksetzen, ... sind jetzt
verfügbar ;-)
1
Heutzutage ist libgit2sharp die bessere Option - siehe Antwort unten.
Jon Rea
50

Was ich jedoch getan habe, ist, eine einfache Klassenbibliothek zu schreiben, um Git-Befehle durch Ausführen eines untergeordneten Prozesses aufzurufen.

Erstellen Sie zunächst eine ProcessStartInfo für eine Konfiguration.

ProcessStartInfo gitInfo = new ProcessStartInfo();
gitInfo.CreateNoWindow = true;
gitInfo.RedirectStandardError = true;
gitInfo.RedirectStandardOutput = true;
gitInfo.FileName = YOUR_GIT_INSTALLED_DIRECTORY + @"\bin\git.exe";

Erstellen Sie dann einen Prozess, um den Befehl tatsächlich auszuführen.

Process gitProcess = new Process();
gitInfo.Arguments = YOUR_GIT_COMMAND; // such as "fetch orign"
gitInfo.WorkingDirectory = YOUR_GIT_REPOSITORY_PATH;

gitProcess.StartInfo = gitInfo;
gitProcess.Start();

string stderr_str = gitProcess.StandardError.ReadToEnd();  // pick up STDERR
string stdout_str = gitProcess.StandardOutput.ReadToEnd(); // pick up STDOUT

gitProcess.WaitForExit();
gitProcess.Close();

Es liegt dann an Ihnen, jetzt einen beliebigen Befehl aufzurufen.

Pok
quelle
15
Ich musste die folgende Zeile hinzufügen, damit der Compiler mit dieser Klasse zufrieden war: gitInfo.UseShellExecute = false;
J Wynia
5
Würde dies nicht zu Problemen mit ssh führen, da es keinen ssh-Agenten gibt, der Schlüssel zum Ziehen und Drücken bereitstellt?
Chris Moschini
2
Siehe diese Antwort auf die Frage Wie erfasst man die Shell-Befehlsausgabe in C #? Einzelheiten zur Erfassung von Standardfehlern und Standardausgaben im Allgemeinen; Dies könnte anscheinend fehlschlagen, wenn die Ausgabe an Standardfehler größer als der relevante Puffer ist.
Kenny Evitt
8
Nicht synchron auslesen und Fehler streamen (Zeilen vor WaitForExit). Es wird ein Deadlock, wenn beide Daten haben.
Aleksander Stankiewicz
Dies ist eine großartige Antwort und hat sehr gut für mich funktioniert. Beachten Sie, dass unter .Net Core 1.0 die Funktion Schließen für Process
System24 Tech am
44

Wie James Manning in einem Kommentar in der aktuell akzeptierten Antwort erwähnt hat, ist die Bibliothek libgit2sharp ein aktiv unterstütztes Projekt, das eine .NET-API für Git bereitstellt.

Kenny Evitt
quelle
Leider wird Pull im Oktober 2013 nicht vollständig unterstützt, da Pull = Fetch + Merge und Merge noch geschrieben werden müssen. Wird großartig sein, wenn es fertig ist! :-)
Russell Giddings
3
Merge wird jetzt von LibGit2Sharp verfügbar gemacht ;-) (siehe # 608 )
nulltoken
2
@KennyEvitt LibGit2Sharp und LibGit2Sharp-SSH sind zwei verschiedene Bibliotheken - letztere ist eine Abzweigung von LibGit2Sharp, hat keine offizielle Unterstützung, hat Nuget-Pakete kaputt gemacht und ist im Allgemeinen eine "off the grid" -Bibliothek. Wenn Sie mit nicht verwaltetem Code auf niedriger Ebene arbeiten, fragen Sie nach Problemen beim Verlassen des Netzes (Speicherlecks, schlechte Ausnahmebehandlung), es sei denn, Sie haben Erfahrung mit dem Verpacken nativer Funktionen.
Doug
3
Ab 1/2020 verarbeitet lib2git STILL keine langen Pfade unter Windows . Wenn dies ein Problem ist, müssen Sie nur für Windows git.
hcoverlambda
1
@ Liam Das scheint nicht ganz richtig zu sein. Sicherlich ist die Entwicklung viel seltener und beinhaltet kleinere Änderungen, aber das ist ziemlich typisch für "ausgereifte" Bibliotheken oder Programme. Persönlich stört mich so etwas nicht mehr. Ich benutze 'alten' Code sehr gut und stoße regelmäßig auf 'neuen' Code, der für mich überhaupt nicht funktioniert. Normalerweise ist das wichtigste Kriterium, ob ich auf Probleme stoße, die wahrscheinlich nicht behoben werden. Es gibt viele offene Fragen im GitHub-Projekt.
Kenny Evitt