git cherry-pick --continue,' - no-edit'选项?

时间:2016-11-18 12:43:59

标签: git git-cherry-pick

我正在编写用于迁移git repos的脚本。关于樱桃挑选冲突我跑

git add .
git cherry-pick --continue

这会调出vim,提示我保存提交消息并冻结脚本。我正在寻找一个命令行选项,如--no-edit--porcelain来解决这个问题。

丑陋的终端黑客也可能受到欢迎;)

3 个答案:

答案 0 :(得分:16)

作为Zildyan said in his answer,在执行git add之前,您需要解决所有冲突。因此,不应使其完全自动化。

也就是说,要跳过编辑提交消息,您只需将编辑器设置为不执行任何操作并报告成功的命令。在类Unix系统上理想的是true命令。因此:

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

会做到这一点。 (您也可以使用任何环境变量GIT_EDITORVISUALEDITOR;事实上,如果设置了其中任何一个,您必须使用它们而不是core.editor,因为序列是:如果已设置,则使用$GIT_EDITOR;否则使用$VISUAL如果已设置;否则使用$EDITOR如果已设置;否则使用core.editor如果已设置;否则使用此版本Git中内置的任何内容。)

答案 1 :(得分:0)

您可以使用:

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

解决冲突后,您可以通过脚本提交。

当然,您可以通过接受我们/他们的代码来设置樱桃挑选策略选项以自动解决冲突

如果没有它,你将获得冲突的标准git标记

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

答案 2 :(得分:0)

来自torekanswer

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

在 Git 2.32(2021 年第二季度)中,不再需要 tihs。

git cherry-pick/revert 带或不带 --[no-]edit 都没有按预期生成编辑器(例如,冲突后仍然要求编辑消息的“revert --no-edit”),这已通过 Git 2.32(2021 年第二季度)进行更正。

参见commit 39edfd5Elijah Newren (newren)(2021 年 3 月 31 日)。
(由 Junio C Hamano -- gitster --commit 82fd285 合并,2021 年 4 月 8 日)

<块引用>

sequencer:修复挑选和回复消息的编辑处理

报告人:Renato Botelho
签字人:Elijah Newren
审核人:约翰内斯·辛德林

<块引用>

save_opts() 应保存所有非默认值。
它的目的是这样做,但由于 struct replay_opts 中的大多数选项默认为 0,它只保存非零值。
不幸的是,这并不总是适用于 options.edit。
粗略地说,options.edit 对于cherry-pick 的默认值为0,对于revert 的默认值为1。
使 save_opts() 记录一个与默认值不同的值。

options.edit 也过于简单;我们有两个以上的案例。
之前存在的行为如下:

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.

但是,预期的行为是:

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

为了获得预期的行为,我们需要将 options.edit 更改为三态:unspecified、false 或 true。

  • 在指定时,我们会按照它所说的去做。
  • 如果未指定,我们需要检查正在创建的当前提交是否正在解决冲突以及咨询 options.action 和 isatty(0)
    在此过程中,添加一个 should_edit() 实用程序函数,该函数根据非冲突情况的附加信息将 options.edit 压缩为布尔值。

continue_single_pick() 是负责在冲突后恢复的函数,无论是选择一个提交还是多个提交。
使此函数在所有情况下都停止假设编辑行为,以便它可以正确处理 !isatty(0) 和不编辑提交消息的特定请求。