Wie kann ein Commit nach dem anderen aus einem Remote-Git-Repository abgerufen werden?

9

Ich versuche, einen Darcs-Spiegel eines Git-Repository einzurichten. Ich habe etwas, das funktioniert OK, aber es gibt ein signifikantes Problem: Wenn ich eine ganze Reihe von Commits zum Git Repo drücke, werden diese Commits in einem einzigen Darcs Patchset zusammengeführt. Ich möchte wirklich sicherstellen, dass jedes Git-Commit als ein einzelnes Darcs-Patchset eingerichtet wird. Ich wette, dass dies möglich ist, indem man eine Art git fetch ausführt, gefolgt von der Abfrage der lokalen Kopie des entfernten Zweigs, aber mein git fu ist dem Job nicht gewachsen.

Hier ist der (ksh) Code, den ich jetzt benutze, mehr oder weniger:

%Vor%

Meine Idee ist

  1. Probieren Sie git fetch aus, um eine lokale Kopie der Remote-Verzweigung zu erhalten (nicht sicher, welche Argumente genau benötigt werden)
  2. Irgendwie die lokale Kopie abfragen, um einen Hash für jedes Commit seit der letzten Spiegelung zu erhalten (ich habe keine Ahnung, wie ich das machen soll)
  3. Durchstreichen Sie alle Hashes, ziehen Sie nur diesen Commit und zeichnen Sie den zugehörigen Patchsatz auf (ich bin mir ziemlich sicher, dass ich weiß, wie ich das mache, wenn ich den Hash bekomme)

Ich würde entweder willkommen heißen, um das obige Szenario zu erläutern oder Vorschläge zu etwas, das ich ausprobieren sollte.

Ideen?

    
Norman Ramsey 21.04.2010, 05:00
quelle

4 Antworten

2

Haben Sie versucht, einige vorhandene Lösungen zum Verschieben von Änderungsmengen zwischen Versionskontrollsystemen wie Schneider zu betrachten, was besagt, dass dies der Fall ist enthält Unterstützung für Git und Darcs? (Es gibt auch Vorschläge für ähnliche Systeme auf dieser Seite.)

Andernfalls, wenn Sie Ihren vorgeschlagenen Ansatz verwenden möchten, können Sie git checkout bei jedem Commit nach HEAD bis origin/master verwenden, um das Commit im Modus "losgelöste HEAD" auszuführen. Zum Beispiel, um das Beispiel zu ändern, das Sie geben (und in bourne shell, ich fürchte, da ich ksh nicht verwende):

%Vor%

Beachten Sie, dass dies die Geschichte von Git linearisiert, was persönlich nicht das ist, was ich wollte. :) Ich denke, es ist am besten, ein vorhandenes Tool dafür zu verwenden, aber der obige Ansatz könnte funktionieren.

    
Mark Longair 07.09.2010 08:55
quelle
1

Sie könnten so etwas tun:

%Vor%

Ich habe ein Repository für dieses Skript erstellt und es ausprobiert. Das Folgende ist vor und nach dem Zusammenführen:

Jetzt hatte ich kein Remote-Repository, also habe ich den Git-Fetch und den Remote-Zweig mit einem lokalen (namens kalle) gefälscht, aber Sie bekommen die Idee. Führen Sie einfach die vollständige Zusammenführung durch und sichern Sie dann den HEAD-Zeiger, bis Sie das erste Commit vom Ursprung / Master erreichen.

    
ralphtheninja 27.04.2011 21:55
quelle
0

git remote update # fetch all remotes I like it better than just fetch

git log origin/master # can be any remote/branch

git cherry-pick origin/master # example remote/branch you can also specify a sha1

cherry-pick wählt standardmäßig den obersten Patch.

für den dritten Teil Ich denke, dass Sie ein Skript schreiben müssen, um es für Sie zu tun. Es gibt andere Möglichkeiten, die Hashes und viele Optionen für das Protokoll zu erhalten. Eigentlich könnte es einen Haken für cherry-pick geben oder einfach post commit ... um den darcs-code laufen zu lassen. schau dir Git Haken an.

In der Tat könnte jeder Patch, der in einer Rebase angewendet wird, einen Git-Commit-Hook aufrufen, so dass du vielleicht in der Lage bist, das zu schreiben und dann einen git pull --rebase zu machen. p>     

xenoterracide 21.04.2010 05:16
quelle
0

Verwenden Sie dies, um Hashes aus einem Zweig abzurufen:

%Vor%

Verwenden Sie dann git cherry-pick -n <hash> , um jedes zu übernehmen.

Eine andere Option, wie von @xenoterracide zitiert, ist die Verwendung von githooks.

    
jweyrich 21.04.2010 05:36
quelle

Tags und Links