git cherry-pick –continue, ‘–no-edit’-Option?

Lesezeit: 4 Minuten

Benutzer-Avatar
Harald Nordgren

Ich schreibe ein Skript zum Migrieren von Git-Repos. Auf Cherry-Pick-Konflikten laufe ich

git add .
git cherry-pick --continue

Dies ruft vim auf und fordert mich auf, die Commit-Nachricht zu speichern, und friert das Skript ein. Ich suche nach einer Befehlszeilenoption wie --no-edit oder --porcelain um dies zu umgehen.

Hässliche Terminal-Hacks könnten auch willkommen sein 😉

  • Nun, ich war mit den von Ihnen geposteten Behauptungen nicht klar, also habe ich einen Test durchgeführt und festgestellt, dass „git cherry-pick –continue“ einfriert, bis Merge-Konflikte gelöst sind. Wie löst man sie also?

    – Zildjan

    18. November 2016 um 13:54 Uhr


  • Ich löse die Konflikte mit git add . im Projektstamm. Ich möchte alle Änderungen akzeptieren und dann ausführen git cherry-pick --continue.

    – Harald Nordgren

    18. November 2016 um 14:06 Uhr


  • @HaraldNordgren Ich hatte das gleiche Problem mit git rebase

    – Joseph K. Strauss

    30. Juni 2017 um 2:17 Uhr

Benutzer-Avatar
Torek

Wie Zildyan in seiner Antwort sagte, müssen Sie das tun beschließen alle Konflikte vor dem Tun git add. Deshalb du sollte nicht machen dies voll automatisiert.

Das heißt, um die Bearbeitung des Commit zu überspringen Botschaft, können Sie Ihren Editor einfach auf einen Befehl einstellen, der nichts tut und Erfolg meldet. Die ideale auf Unix-ähnlichen Systemen ist die true Befehl. Somit:

git -c core.editor=true cherry-pick --continue

wird den Trick machen. (Sie können auch eine der Umgebungsvariablen verwenden GIT_EDITOR, VISUALoder EDITOR; und in der Tat, wenn eines davon eingestellt ist, Sie muss benutze sie lieber als core.editor denn die Reihenfolge ist: use $GIT_EDITOR wenn das eingestellt ist; sonst verwenden $VISUAL wenn das eingestellt ist; sonst verwenden $EDITOR wenn das eingestellt ist; sonst verwenden core.editor wenn das eingestellt ist; Verwenden Sie andernfalls alles, was in diese Version von Git integriert ist.)

  • Ich bevorzuge die Fits-Option (mit -c), weil es keine Nebenwirkungen gibt. Außerdem kann es leicht in einen Alias ​​umgewandelt werden.

    – Joseph K. Strauss

    30. Juni 2017 um 2:17 Uhr

  • @JosephK.Strauss: Beachten Sie, dass Sie zum Festlegen einen Shell-Alias ​​verwenden können GIT_EDITORz.B, alias foo='GIT_EDITOR=true git cherry-pick --continue' in Bash oder über einen Git-Alias, der verwendet ! um die Shell aufzurufen. jedoch, wenn -c core.editor=true reicht, das ist auch in Ordnung.

    – Torek

    30. Juni 2017 um 4:13 Uhr


  • Dieser Trick funktioniert auch gut in einem interaktiven Rebase: git -c core.editor=true rebase --continue

    – hoijui

    15. Mai 2019 um 7:11 Uhr

Benutzer-Avatar
Zildjan

Sie können Folgendes verwenden:

git cherry-pick <sha1> --no-commit

Nachdem Sie den Konflikt gelöst haben, können Sie ihn vom Skript aus übergeben.

Natürlich können Sie Strategieoptionen aus der Kirsche auswählen, um Konflikte automatisch zu lösen, indem Sie Code von uns/ihren akzeptieren

Ohne das erhalten Sie ein standardmäßiges Git-Markup für Konflikte

+<<<<<<< HEAD
         some code
+||||||| parent of 4d64ec6... test commit
+        first version code
+=======
+        second version code
+>>>>>>> 4d64ec6... test commit

Aus Toreks Antwort:

git -c core.editor=true cherry-pick --continue

Mit Git 2.32 (Q2 2021) wird tihs nicht mehr benötigt.

git cherry-pick/revert mit oder ohne --[no-]edit hat den Editor nicht wie erwartet erzeugt (z. B. “revert --no-edit” nach einem Konflikt immer noch aufgefordert, die Nachricht zu bearbeiten), was mit Git 2.32 (Q2 2021) korrigiert wurde.

Sehen Commit 39edfd5 (31. März 2021) von Elijah Newren (newren).
(Zusammengeführt von Junio ​​C. Hamano — gitster in übertrage 82fd28508.04.2021)

sequencer: Bearbeitungsbehandlung für Cherry-Pick- und Revert-Meldungen korrigiert

Berichtet von: Renato Botelho
Unterzeichnet von: Elijah Newren
Rezensiert von: Johannes Schindelin

save_opts() sollte alle nicht standardmäßigen Werte speichern.
Dies war beabsichtigt, aber da die meisten Optionen in struct replay_opts standardmäßig auf 0, es wurden nur Nicht-Null-Werte gespeichert.
Leider funktioniert dies nicht immer für options.edit.
Grob gesagt hatte options.edit einen Standardwert von 0 für Cherry-Pick, aber einen Standardwert von 1 für Revert.
Machen save_opts() Zeichnen Sie einen Wert auf, wenn er vom Standardwert abweicht.

options.edit war auch zu einfach; Wir hatten mehr als zwei Fälle.
Das bisherige Verhalten war wie folgt:

Non-conflict commits    Right after Conflict
Edit iff isatty(0)      Edit (ignore isatty(0))
No edit                 See above
Edit (ignore isatty(0)) See above
(*)                     See above

(*) Before stopping for conflicts, No edit is the behavior.  After
    stopping for conflicts, the --no-edit flag is not saved so see
    the first two rows.

Das erwartete Verhalten ist jedoch:

Non-conflict commits    Right after Conflict
Edit iff isatty(0)      Edit iff isatty(0)
No edit                 Edit iff isatty(0)
Edit (ignore isatty(0)) Edit (ignore isatty(0))
No edit                 No edit

Um das erwartete Verhalten zu erhalten, müssen wir options.edit in einen Tri-State ändern: unspecified, false oder true.

  • Wenn angegeben, folgen wir dem, was es sagt.
  • Wenn nicht angegeben, müssen wir prüfen, ob der aktuell erstellte Commit einen Konflikt löst, sowie Optionen konsultieren. Aktion und isatty(0).
    Fügen Sie dabei a hinzu should_edit() Utility-Funktion, die komprimiert options.edit auf einen booleschen Wert herunter, basierend auf den zusätzlichen Informationen für den Nicht-Konflikt-Fall.

continue_single_pick() ist die Funktion, die für die Wiederaufnahme nach Konfliktfällen verantwortlich ist, unabhängig davon, ob ein Commit oder viele ausgewählt werden.
Stellen Sie sicher, dass diese Funktion in allen Fällen kein Bearbeitungsverhalten annimmt, damit sie korrekt verarbeitet werden kann !isatty(0) und spezifische Anfragen, die Commit-Nachricht nicht zu bearbeiten.

1143300cookie-checkgit cherry-pick –continue, ‘–no-edit’-Option?

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

Privacy policy