2016-08-29 3 views
0

Ich habe etwa 160k Commits mit jeweils 3 Dateien aktualisiert (Github als Website verwendet worden), und ich bin auf der Suche nach einem Weg, um die Dateien zu bekommen, so kann ich dann den Inhalt in ein echte DB.Holen Sie sich Dateien von jedem git commit

Meine Frage ist, wie bekomme ich (heruntergeladen?) Die aktualisierten Dateien von jedem Commit, speichern sie in einem Ordner mit einem Zeitstempel/commitSHA an den Namen angehängt, um Namenskonflikte zu vermeiden.

Ist das mit Git möglich? Ich weiß, dass ich die Github-Site verwenden kann, um die Dateien zu sehen und was sich geändert hat, aber das Problem ist, dass es über 160k Commits gibt.

+0

was ich verstehe ist, dass Sie versuchen, jede 160k Version der Datei zu bekommen, ist es richtig? –

+0

Korrigieren. Sobald ich die Dateien habe, weiß ich, was ich mit ihnen machen soll, sie zu bekommen ist das Problem. – Tribe

Antwort

1

Das ist nicht die eleganteste Lösung, aber es sollte funktionieren.

Zuerst müssen Sie eine lokale Kopie des Repository erhalten mit:

git clone <repo-url> 

Sie erhalten die <repo-url> von der GitHub Seite Ihres Projekts (überprüfen Sie die „Clone oder herunterladen“ Taste).

Sie dann cd in den lokalen Repo und laufen etwas in dieser Richtung:

for rev in $(git log --format=%H); do 
    git checkout $rev -- file1 
    cp file1 ../history/file1-$rev 
done 

Stellen Sie sicher, das history Verzeichnis im Voraus erstellen. Dupliziere die zwei Zeilen innerhalb der Schleife für jede Datei, die du bekommen musst.

Führen Sie am Ende git reset --hard, um das Repository in seinem ursprünglichen Zustand zu lassen.

Wenn Sie auch den Zeitstempel der Datei benötigen, können Sie ihn mit git log --format=%ct file1 erhalten. Ersetzen Sie den cp Befehl mit:

ts=$(git log --format=%ct $rev file1) 
cp file1 ../history/file1-$rev-$ts 

Überprüfen Sie die documentation für andere Datei oder begehen Eigenschaften, die Sie get log bekommen verwenden können.

+0

Danke an alle 3 von Euch (Larsks, Fabrizio Migotto und Sie Axiac). Diese zu machen war nur richtig, weil sie alle Schritte hat. Jetzt kann ich warten, während ich 500Kish TXT-Dateien herunterladen! – Tribe

1

Sobald Sie eine lokale Arbeitskopie Ihres Repository * haben, können Sie die Dateien von jedem git commit nur erhalten, indem Sie aus, die zu begehen, wie in:

git checkout 1e6c98511d9154bfdc49a31fd26229953df0bd70 

Also, die Dateien aus jedem zu bekommen Commit in Ihrem Projektverlauf, Sie müssten nur (a) eine Liste von Commits für Ihr Projekt generieren und dann (b) über diese Liste iterieren, jedes Commit auschecken und die Dateien verarbeiten.

Der Befehl git rev-list HEAD generiert eine Liste aller Commits auf dem aktuellen Zweig (von neu nach alt). Wenn Sie diese Dateien in Vorwärtsreihenfolge verarbeiten möchten, können Sie diese an tac übergeben, um die Liste umzukehren, z.

for rev in $(git rev-list HEAD | tac); do 
    git checkout $rev 
    ...do something here... 
done 

* von git clone <repourl>

1

laufen Sie mit git neu sind Angenommen, sehen Sie die git-Tools von hier installieren:

https://git-scm.com/

Dann werden Sie Ihr Repository klonen müssen in der Git-Konsole laufen:

git clone https://github.com/username/repositoryname.git

Nach diesen Schritten können Sie die verschiedenen Commits verschieben, wie @larsk erklärt.

Für jede Auflistung begehen eine bestimmte Datei:

List all commits for a specific file

Verwandte Themen