2016-06-27 4 views
1

Ich habe eine Handvoll Repositories (vielleicht 15 oder 20), die meisten mit mehreren hundert Commits. Ich möchte in der Lage sein, eine Batch-Datei, die git hat, ein Protokoll von jedem in eine Textdatei zu schreiben, damit ich sie analysieren kann (sobald ich die separaten Dateien habe, glaube ich, kann ich leicht tun, und C# am wahrscheinlichsten zu verwenden).Schreiben Sie Git-Logs in eine Textdatei, wenn sie aus einer Batch-Datei aufgerufen werden

Ich weiß, ich git-bash in separaten Befehlen so etwas wie zu tun, verwenden kann:

cd "<path to my repo>" 
git --no-pager log > log.txt 

Dies wird mir die Dateien, die ich will, aber wie kann dies in einer Batch-Datei erreicht werden?
Kann ich git-bash auf diese Weise verwenden? Muss ich stattdessen git.exe verwenden?

Wenn es keine gute Idee ist, dies über eine Batch-Datei zu tun, ist dies in C# mit Process.Start möglich?

Einige der Fragen, die ich auf bisher konzentriert haben:
How do I export a git log to a text file? (wie ich lehnte git-bash zu verwenden, um ein Textprotokoll zu erstellen)
Run git commands from a C# function
Running Bash Commands from C#

Aber ich bin immer noch nicht Sicher, wie ich auf jedem der einzelnen Repositories was ich will aufrufen. Vor allem in einer Batch-Datei, wo zu meinem begrenzten Wissen, jede Zeile ist ein eigenständiger Befehl (Beseitigung von git-Bash.exe als eine Möglichkeit?).

aktualisieren

Ich habe versucht, den folgenden Code verwendet:

public void RunGitForLogs() 
{ 
    Process process = new Process(); 

    ProcessStartInfo processStartInfo = new ProcessStartInfo(); 
    processStartInfo.WindowStyle = ProcessWindowStyle.Hidden; 
    processStartInfo.FileName = @"C:\Program Files\Git\bin\git.exe"; 
    processStartInfo.WorkingDirectory = @"E:\git\myRepo"; 
    processStartInfo.Arguments = @"log --no-pager > C:\users\me\desktop\log.txt"; 
    processStartInfo.RedirectStandardOutput = true; 
    processStartInfo.RedirectStandardError = true; 
    processStartInfo.UseShellExecute = false; 

    process.StartInfo = processStartInfo; 
    process.Start(); 

    var outStd = new List<string>(); 
    var outErr = new List<string>(); 

    //https://stackoverflow.com/a/16276776/2957232 
    while (process.StandardOutput.Peek() > -1) 
     outStd .Add(process.StandardOutput.ReadLine()); 

    while (process.StandardError.Peek() > -1) 
     outErr .Add(process.StandardError.ReadLine()); 

    process.WaitForExit(); 
} 

Aber in OutErr erhalte ich die folgenden Zeilen:

fatal: mehrdeutig Argument '>': unbekannte Revision oder Pfad nicht im Arbeitsbaum
Use '-' Wege von Revisionen zu trennen, wie folgt aus:
'git [...] - [...]'

"Status" Verwendung als ein Argument funktioniert wie erwartet für Dieses Repo (Viele Zeilen in outStd, nichts in outErr).

+0

Dies scheint es ziemlich einfach sein sollte, aber ich sehe nichts über meine Suche ... Seltsam. Ich würde annehmen, dass dies eine nützliche Sache für Leute sein würde, die es schon einmal getan haben. –

+0

Es ist sehr gut möglich, dies über 'Process.Start (...)' zu tun, solange Sie das Arbeitsverzeichnis über ein 'ProcessStartInfo'-Objekt setzen. –

+0

@ ext0 - Können Sie das als Antwort aufschreiben? Ich experimentiere mit den Antworten im letzten Link, der jetzt gepostet wurde, um etwas aufzuschreiben, aber ich habe nicht die beste Zeit damit ... –

Antwort

1

Wahrscheinlich nicht die schönste Art und Weise, dies zu tun, aber das aus einem Fenster namens Zeilendatei für mich .cmd funktioniert:

cmd.exe /c start /d"c:\my\git\repo\dir" /b git.exe --no-pager log > log.txt 
+0

Geht das davon aus, Sie haben git.exe in Ihrem Pfad? Ich habe versucht, "git.exe" mit dem vollständigen Pfad zur exe zu ersetzen und bekam "Windows kann nicht finden --no-pager '.......". –

+0

Ja, ich bin mir auch nicht so sicher @DangerZone. Wenn ich ** nur ** den Repo-Pfad ersetze, klagt er über git.exe, wenn ich ihm den vollständigen Pfad dazu gebe, klagt er über --no-Pager. Wenn ich dies zur Arbeit bringen könnte, würde ich es gerne als Antwort akzeptieren. –

+0

Ja, es ist in meinem Pfad. Sie können auch den git-Pfad zu Ihrem aktuellen Verzeichnis machen, bevor Sie diese Zeile aufrufen. –

Verwandte Themen