git cherry-pick --continue命令,'--no-edit'选项是什么?

24

我正在编写一个用于迁移Git仓库的脚本。在进行cherry-pick操作时,我运行以下命令:

git add .
git cherry-pick --continue

这会启动vim并提示我保存提交消息,也会使脚本冻结。我正在寻找类似--no-edit--porcelain的命令行选项来避免这种情况。

丑陋的终端黑科技也许也可以接受 ;)


我对你发布的声明不是很清楚,所以我进行了测试,并发现 'git cherry-pick --continue' 会在合并冲突解决之前冻结。那么你如何解决这些冲突呢? - Zildyan
我使用 git add . 命令解决项目根目录中的冲突。我想接受所有更改,然后运行 git cherry-pick --continue 命令。 - Harald Nordgren
@HaraldNordgren 我在使用 git rebase 时遇到了同样的问题。 - Joseph K. Strauss
3个回答

34

正如Zildyan在他的回答中所说,在执行git add之前,您需要解决所有冲突。因此,您不应该将此过程完全自动化。

话虽如此,如果要跳过编辑提交消息,您可以简单地将编辑器设置为一个什么都不做并报告成功的命令。Unix类系统上的理想命令是true命令。因此:

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

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


我更喜欢使用fits选项(使用-c),因为它没有副作用。此外,它可以很容易地转换为别名。 - Joseph K. Strauss
1
@JosephK.Strauss:请注意,您可以使用shell别名来设置GIT_EDITOR,例如,在bash中使用alias foo ='GIT_EDITOR=true git cherry-pick --continue',或者通过使用调用shell的Git别名。但是,如果-c core.editor=true足够,那也可以。 - torek
这个技巧在交互式变基中同样适用:git -c core.editor=true rebase --continue - hoijui
我在度假期间通过Android平板电脑在Termux中使用Git时遇到了这个问题,花了大约5分钟的时间非常沮丧,直到找到了这个答案。 - silencedogood
1
@silencedogood:我对Termux一无所知,但学习使用旧式的“行编辑器”如ed和ex非常方便... - torek

2

您可以使用:

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

解决冲突后,您可以从脚本中提交它。

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

如果没有这个选项,您将得到标准的git冲突标记

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

0

来自torek答案

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

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

git cherry-pick/revert 使用或不使用 --[no-]edit 选项时未按预期生成编辑器(例如,在冲突后执行 "revert --no-edit" 仍要求编辑消息),这已在 Git 2.32(2021 年第二季度)中得到纠正。

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

序列控制器:修复樱桃拣选和还原消息的编辑处理

报告者:Renato Botelho
签署者:Elijah Newren
审核者:Johannes Schindelin

save_opts() 应该保存任何非默认值。
本意是这样做的,但由于结构体 replay_opts 中的大多数选项默认为 0,因此它只保存非零值。
不幸的是,这对于 options.edit 并不总是有效。
粗略地说,options.edit 在 cherry-pick 的情况下具有默认值 0,而在 revert 的情况下具有默认值 1。
使 save_opts() 记录每当它与默认值不同时的值。

options.edit 也过于简单化了;我们有超过两种情况。
先前存在的行为如下:

非冲突提交    冲突后立即
编辑如果 isatty(0)  编辑(忽略 isatty(0))
无编辑                 见上文
编辑(忽略 isatty(0)) 见上文
(*)                     见上文

(*) 在停止冲突之前,无编辑是行为。在停止冲突之后,--no-edit 标志未保存,因此请参见前两行。

然而,预期的行为是:

非冲突提交    冲突后立即
编辑如果 isatty(0)  编辑如果 isatty(0)
无编辑                 编辑如果 isatty(0)
编辑(忽略 isatty(0)) 编辑(忽略 isatty(0))
无编辑                 无编辑

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

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

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


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接