Ich habe ein Git-Repository (das mehr oder weniger Projektgeschichte abdeckt) und separate Quellen (nur einen Tarball mit wenigen Dateien), die sich vor einiger Zeit gespalten haben (eigentlich irgendwo in 2004 oder 2005).
Die Quellen von Tarball haben eine ganze Reihe von Änderungen erfahren, von denen ich einige einbeziehen möchte. Nun ist die Frage - wie man herausfinden kann, was eigentlich der Verzweigungspunkt für die veränderten Quellen ist, um minimale Diff von dem zu bekommen, was dort passiert ist.
Was ich im Grunde will, ist, in der git-Geschichte Platz zu finden, wo der Code dem Tarball der Quellen, die ich habe, am ähnlichsten ist. Und ich möchte das nicht manuell machen.
Es ist auch erwähnenswert, dass die geänderten Quellen nur eine Teilmenge von Dateien enthalten und einige Dateien in mehr aufgeteilt haben. Allerdings scheint der Code, der darin enthalten ist, nur kleine Modifikationen und einige Zusätze zu erhalten.
Wenn du damit selbst spielen willst, ist der Tarball mit Quellen hier und Git wird gehostet in Gitorious : git://gitorious.org/gammu/mainline.git
Im allgemeinen Fall müßtest du tatsächlich jedes einzelne Commit untersuchen, weil du nicht wissen kannst, ob du ein großes diff in einem haben solltest, kleines diff das nächste, dann ein anderes riesiges diff, dann ein medium diff ...
Ihre beste Wette wird wahrscheinlich sein, sich auf bestimmte Dateien zu beschränken. Wenn Sie nur eine einzige Datei betrachten, sollte es nicht lange dauern, alle Versionen dieser Datei zu durchlaufen (verwenden Sie git rev-list <path>
, um eine Liste zu erhalten, sodass Sie nicht jedes Commit testen müssen). Für jedes Commit, das die Datei geändert hat, können Sie die Größe des diff überprüfen und ziemlich schnell ein Minimum finden. Tun Sie dies für eine Handvoll Dateien, hoffentlich werden sie zustimmen!
Der beste Weg, sich für das Diffing zu entscheiden, ist ein temporäres Commit durch einfaches Kopieren Ihres Tarballs, so dass Sie einen Zweig namens tarball
zum Vergleichen haben können. Auf diese Weise könnten Sie Folgendes tun:
, um eine schöne Liste aller Commits mit ihren Diff-Größen zu erhalten (die ersten drei Spalten sind SHA1, Anzahl der hinzugefügten Zeilen und Anzahl der entfernten Zeilen). Dann könntest du es einfach in awk '{print ,+}' | sort -n -k 2
einfügen, und du hättest eine sortierte Liste von Commits und deren Diff-Größen!
Wenn Sie sich nicht auf eine kleine Handvoll zu testender Dateien beschränken können, könnte ich versucht sein, etwas ähnliches wie git-bisect
von Hand zu implementieren - versuchen Sie einfach, sich auf ein kleines diff zu beschränken, und nehmen Sie an, dass aller Wahrscheinlichkeit nach werden Commits in der Nähe Ihres besten Falls auch kleinere Diffs haben, und Commits weit davon werden größere Diffs haben. (Irgendwo zwischen Newtons Methode und einer vollständigen binären / Gittersuche, wahrscheinlich?)
Bearbeiten: Eine andere Möglichkeit, vorgeschlagen in Douglas 'answer , wenn Sie denken, dass einige Dateien identisch sind mit denen in einigen Commit, ist, sie mit git-hash-object
, und dann sehen Sie, welche Commits in Ihrem Verlauf diesen Blob haben. Es gibt eine Frage mit einigen exzellenten Antworten , wie man das macht. Wenn Sie dies mit einer Handvoll Dateien tun - vorzugsweise solchen, die sich häufig geändert haben - können Sie das Ziel-Commit möglicherweise ziemlich schnell eingrenzen.
Keine gute Lösung, aber um zu erraten, welche Revisionen es sein könnte: Angenommen, einige der Dateien im Tar-Ball wurden seit ihrer Verzweigung nicht geändert. Führen Sie Git-Hash-Objekt gegen jede Datei im Teerball aus, Suchen Sie dann im Repository nach diesen Dateien, indem Sie git show verwenden. Versuchen Sie dann, die Commits zu finden, unter denen diese Dateien enthalten waren, möglicherweise unter Verwendung von git whatchanged . Die Antwort auf Ihre Frage könnte dann das Commit mit den gebräuchlichsten Dateien sein, aber es wird immer noch ein bisschen Glück sein.
basierend auf was Araqnid sagte ich kam mit 9c6c864426bf88429e77c7e22b5aa78e9295b97a (nur für Zeug zwischen 0.61.0 und HEAD gefragt) dies ist wahrscheinlich nicht die beste) Sie könnten besser mit etwas wie
%Vor%vorausgesetzt, du hast den Tarball in git importiert und diese Revision ausgecheckt (ich habe das durch das Entpacken gemacht und dann
%Vor%Nachdem du das gemacht hast und den obigen Befehl ausgeführt hast, sollte es die Größe aller Diffs in aufsteigender Reihenfolge der Patchgröße (die erste wird 0 sein, da es den aktuellen Kopf finden wird) ausgeben, es wird eine lange Zeit dauern ... aber es sollte den kleinsten Unterschied finden ...
Wie wurde die Gabel hergestellt? War es ein Klon, den jemand anderes gemacht hat, und hat dann seine eigene Arbeit gemacht? Wenn ja, dann ist das wirklich einfach. Sie müssen lediglich eine lokale Verzweigung erstellen, die den Code von der Verzweigung abruft. git wird die Herkunft des verzweigten Zweiges sehen, der auf eines der Commits aus Ihrem ursprünglichen Repository verweist und sozusagen "connect the dots" ... es verbindet den Verlauf von Ihrem ursprünglichen Repository mit dem fork wieder.
Sie sollten dies tun können:
%Vor% An diesem Punkt können Sie gitk
ausführen und den vollständigen Verlauf des verzweigten Zweiges und Ihres lokalen Repositorys sehen und sehen, ob sie sich verbinden oder nicht.
Importieren Sie diese Dateien im Tarball in eine git-Revision, in einen separaten Zweig oder einen komplett neuen: Die Position im Revisionsdiagramm ist nicht wichtig, wir wollen sie nur als Baum verfügbar machen.
Jetzt für jede Revision in Master, einfach gegen diese Baum / Revision ('importiert') diffundieren und nur ausgeben, wie groß das Diff ist. Etwas wie:
%Vor%Die Revision mit der kleinsten Patch-Größe wird also nach einer sehr groben Faustregel die "nächste" sein. (Eine identische Revision erzeugt eine Patch-Größe von 0, und alles andere wird sicherlich nicht Null sein, und je mehr sich geändert hat, desto größer).
Wenn Sie eine ungefähre Vorstellung davon haben, wo die Gabelung aufgetreten ist, sollten Sie Will Manleys git meld
verwenden. (Siehe auch: Differenzen von Zweigen mit Meld anzeigen? .)
Fügen Sie dazu den Tarball-Inhalt Ihrem Repository hinzu (was Sie ohnehin tun werden). Nachdem Sie Meld und git-meld
installiert haben, führen Sie
bei verschiedenen Commits, bis Sie den mit den geringsten Unterschieden gefunden haben. Dieser Befehl öffnet meld
und zeigt die Änderungen in der Verzeichnisstruktur zwischen den angegebenen Commits an, wobei identische Dateien ausgeblendet sind. Beispiel Screenshots:
Meldung, die zwei sehr unterschiedliche Commits zeigt:
Zeigt zwei ähnliche Commits:
Tags und Links diff git search branching-and-merging