wake-up-neo.net

Wie vergleiche ich zwei Git-Repositorys?

Ich habe zwei verschiedene Exporte unseres CVS-Repositorys in Git. Sie weichen irgendwann voneinander ab, und ich untersuche, warum. Die Entwicklungslinie reicht mehrere Jahre zurück und über Zehntausende von Verpflichtungen.

Zu Beginn der Entwicklungslinie sind die SHA1-IDs für jedes Commit identisch, was mir sagt, dass git-cvsimport sehr konsistent ist, was es tut, wenn es die Ergebnisse von cvsps und Imports liest.

Aber irgendwann zwischen dem ersten Festschreiben und gestern beginnen die SHA1-IDs zu divergieren. Ich möchte herausfinden, wo sich dies befindet, indem ich eine Liste der Festschreibungs-IDs aus jedem Repository vergleiche und nachschaue, was fehlt. Gibt es dafür gute Werkzeuge oder Techniken?

28
skiphoppy

Warum nicht einfach das Git-Protokoll jedes Repos in eine eigene Datei kopieren und vergleichen? Der Unterschied, der dem Ende der Datei am nächsten kommt, besteht darin, wo sie angefangen haben, auseinander zu laufen ...

18
Jason Punyon

Da die beiden Git-Repositorys gleich beginnen, können Sie beide in dasselbe Arbeitsrepository ziehen.

$ git remote add cvsimport-a git://.../cvsimport-a.git
$ git remote add cvsimport-b git://.../cvsimport-b.git
$ git remote update
$ git log cvsimport-a/master..cvsimport-b/master  # in B, not in A?
$ git log cvsimport-b/master..cvsimport-a/master  # in A, not in B?
33
ephemient

Führen Sie in einem Ihrer Repos die folgenden Schritte aus:

$ git remote add other-repo git://.../other-repo.git
$ git remote update
$ git log other-repo/master...master
  # or maybe:
$ gitk master... other-repo/master

Dies gibt Ihnen den symmetrischen Unterschied zwischen zwei Repos; Dies zeigt Ihnen alle Commits, die sich in einem Repo befinden, aber nicht im anderen.

13
Brian Campbell

Der naheliegende Weg wäre, ein Repository zu klonen, die Spitze des Hauptzweigs des anderen Repositorys in den Klon zu holen und mit git merge-base auf den beiden Spitzen den gemeinsamen Vorfahren zu finden.

6
CB Bailey

Sie können beide Repositorys in ein einzelnes Repository stellen (abrufen), entweder ein neues oder eines der vorhandenen, wie in den Antworten von ephemient , Charles Bailey und Brian Campbell . Oder Sie können den Trick von Tipps und Tricks Seite im Git Wiki verwenden, oder genauer gesagt, die Frage "Wie werden zwei lokale Repositories verglichen?".

Es ist jedoch möglicherweise einfacher, eine Liste der SHA-1-Commits in topologischer Reihenfolge mit "git rev-list" (oder "git-log" mit entsprechenden Optionen) zu erstellen und die erste abweichende Revision zu überprüfen.

0
Jakub Narębski

Ich hatte vor kurzem einen ähnlichen Bedarf. Ich hatte ein geklontes Remote-Projekt, das ich mit einer aktuellen kopierten Codebasis vergleichen musste. Die Git-Protokolle waren nicht relevant, da die Commits nichts gemeinsam hatten und ich nicht sicher war, ob sie von derselben Codebasis stammten.

Um das Problem zu lösen, habe ich git brachial eingesetzt. Ich habe die zu überprüfenden Dateien in das Git-Repo kopiert und dann den git status auf eine Liste geänderter Dateien überprüft.

Darüber hinaus kann git diff <filename> auch zur weiteren Überprüfung verwendet werden. Ich konnte Dateien innerhalb von vergleichen

0
nobis99