Wie ziehe ich jeweils einen Commit aus einem Remote-Git-Repository?

Lesezeit: 4 Minuten

Ich versuche, einen Darcs-Spiegel eines Git-Repositorys einzurichten. Ich habe etwas, das gut funktioniert, aber es gibt ein erhebliches Problem: Wenn ich eine ganze Reihe von Commits in das Git-Repo schiebe, werden diese Commits zu einem einzigen Darcs-Patchset zusammengeführt. Ich möchte wirklich sicherstellen, dass jeder Git-Commit als einzelnes Darcs-Patchset eingerichtet wird. Ich wette, das ist möglich, indem man etwas tut git fetch gefolgt von einer Abfrage der lokalen Kopie des Remote-Zweigs, aber mein Git-Fu ist der Aufgabe nicht gewachsen.

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

git pull -v # pulls all the commits from remote --- bad!

# gets information about only the last commit pulled -- bad!
author="$(git log HEAD^..HEAD --pretty=format:"%an <%ae>")"
logfile=$(mktemp)
git log HEAD^..HEAD --pretty=format:"%s%n%b%n" > $logfile

# add all new files to darcs and record a patchset. this part is OK
darcs add -q --umask=0002 -r .
darcs record -a -A "$author" --logfile="$logfile"
darcs push -a
rm -f $logfile

Meine Idee ist

  1. Versuchen git fetch um eine lokale Kopie des Remote-Zweigs zu erhalten (nicht sicher, welche Argumente genau benötigt werden)
  2. Irgendwie die lokale Kopie abfragen, um einen Hash für jeden Commit seit der letzten Spiegelungsoperation zu erhalten (ich habe keine Ahnung, wie das geht)
  3. Durchlaufen Sie alle Hashes, ziehen Sie nur diesen Commit und zeichnen Sie das zugehörige Patchset auf (ich bin mir ziemlich sicher, dass ich weiß, wie das geht, wenn ich den Hash in die Hände bekomme)

Beides würde ich begrüßen Helfen Sie mit, das obige Szenario zu konkretisieren oder Vorschläge bzgl etwas anderes sollte ich versuchen.

Ideen?

  • Nur zur Erinnerung, unten sind ein paar neue Antworten, die Sie noch nicht kommentiert haben. (Offensichtlich beantwortet meiner Meinung nach einer von ihnen Ihre Frage besonders gut ;))

    – Mark Longair

    16. Mai 2011 um 9:58 Uhr

Haben Sie versucht, sich einige vorhandene Lösungen zum Verschieben von Änderungssätzen zwischen Versionskontrollsystemen anzusehen, z Schneider, was besagt, dass es Unterstützung für Git und Darcs enthält? (Auf dieser Seite finden Sie auch Vorschläge für ähnliche Systeme.)

Andernfalls, wenn Sie Ihren vorgeschlagenen Ansatz verwenden möchten, können Sie verwenden git checkout bei jedem Commit danach HEAD zu origin/master um diesen Commit im “detached HEAD”-Modus auszuchecken. Um beispielsweise das von Ihnen angegebene Beispiel zu ändern (und in der Bourne-Shell, fürchte ich, da ich ksh nicht verwende):

# Update all remote-tracking branches from origin
git fetch origin

for c in `git log --pretty=format:"%h" HEAD..origin/master`
do
     git checkout $c
     author=$(git log -1 --pretty=format:"%an <%ae>")
     logfile=$(mktemp)
     git log -1 --pretty=format:"%s%n%n%b%n" > $logfile

     darcs add -q --umask=0002 -r .
     darcs record -a -A "$author" --logfile="$logfile"
     darcs push -a
     rm -f $logfile         
done

# Now go back to master, and merge to keep your master branch up to date:
git checkout master
git merge origin/master

Beachten Sie, dass dies den Verlauf von git linearisieren wird, was ich persönlich nicht wollte. 🙂 Ich denke, es ist am besten, dafür ein vorhandenes Tool zu verwenden, aber der obige Ansatz könnte zum Laufen gebracht werden.

Du könntest so etwas machen:

#!/bin/bash
git fetch
count=$(git log --pretty=oneline | wc -l)
git merge origin/master
git reset --hard HEAD~$((count-1))

Ich habe ein Repository für dieses Skript erstellt und es ausprobiert. Folgendes ist vor und nach der Zusammenführung:

Geben Sie hier die Bildbeschreibung ein

Geben Sie hier die Bildbeschreibung ein

Jetzt hatte ich kein Remote-Repository, also habe ich den Git-Fetch und den Remote-Zweig mit einem lokalen (namens kalle) vorgetäuscht, aber Sie verstehen die Idee. Führen Sie einfach die vollständige Zusammenführung durch und sichern Sie dann den HEAD-Zeiger, bis Sie den ersten Commit von Origin/Master erreichen.

Wie ziehe ich jeweils einen Commit aus einem Remote Git Repository
Fremdenmord

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 aus.

Für den dritten Teil müssen Sie meiner Meinung nach ein Skript schreiben, das dies für Sie erledigt. Es gibt andere Möglichkeiten, die Hashes und viele Optionen für das Protokoll zu erhalten. Tatsächlich könnte es einen Hook für Cherry-Pick oder vielleicht nur Post Commit geben … um den Darcs-Code auszuführen. Schauen Sie sich Git-Hooks an.

Tatsächlich kann jeder Patch, der in einer Rebase angewendet wird, einen Git-Commit-Hook aufrufen, sodass Sie möglicherweise in der Lage sind, diesen zu schreiben und dann einen Git-Pull –Rebase auszuführen und diesen Code bei jeder Anwendung festzunageln …

  • Ich habe Informationen im Internet für studiert git cherry-pick, und das ist überhaupt nicht das, was ich will! Es erstellt ein neues, eindeutiges Commit! Ich werde tiefer graben.

    – Norman Ramsey

    22. April 2010 um 22:57 Uhr

1647187695 667 Wie ziehe ich jeweils einen Commit aus einem Remote Git Repository
jweyrich

Verwenden Sie dies, um Hashes aus einem Zweig abzurufen:

git log --pretty=format:"%h" HEAD..origin/master

Dann benutze git cherry-pick -n <hash> jeden anzuwenden.

Eine weitere Option, wie von @xenoterracide zitiert, ist die Verwendung von Githooks.

998340cookie-checkWie ziehe ich jeweils einen Commit aus einem Remote-Git-Repository?

This website is using cookies to improve the user-friendliness. You agree by using the website further.

Privacy policy