我正在编写一个用于迁移Git仓库的脚本。在进行cherry-pick操作时,我运行以下命令:
git add .
git cherry-pick --continue
这会启动vim并提示我保存提交消息,也会使脚本冻结。我正在寻找类似--no-edit
或--porcelain
的命令行选项来避免这种情况。
丑陋的终端黑科技也许也可以接受 ;)
我正在编写一个用于迁移Git仓库的脚本。在进行cherry-pick操作时,我运行以下命令:
git add .
git cherry-pick --continue
这会启动vim并提示我保存提交消息,也会使脚本冻结。我正在寻找类似--no-edit
或--porcelain
的命令行选项来避免这种情况。
丑陋的终端黑科技也许也可以接受 ;)
正如Zildyan在他的回答中所说,在执行git add
之前,您需要解决所有冲突。因此,您不应该将此过程完全自动化。
话虽如此,如果要跳过编辑提交消息,您可以简单地将编辑器设置为一个什么都不做并报告成功的命令。Unix类系统上的理想命令是true
命令。因此:
git -c core.editor=true cherry-pick --continue
会有所帮助。 (您还可以使用任何环境变量GIT_EDITOR
,VISUAL
或EDITOR
; 实际上,如果设置了其中任何一个,则必须使用它们,而不是core.editor
,因为序列是:如果设置了$GIT_EDITOR
,则使用它; 否则,如果设置了$VISUAL
,则使用它; 否则,如果设置了$EDITOR
,则使用它; 否则,如果设置了core.editor
,则使用它; 否则,使用此版本的 Git 中内置的内容。)
-c
),因为它没有副作用。此外,它可以很容易地转换为别名。 - Joseph K. StraussGIT_EDITOR
,例如,在bash中使用alias foo ='GIT_EDITOR=true git cherry-pick --continue'
,或者通过使用!
调用shell的Git别名。但是,如果-c core.editor=true
足够,那也可以。 - torekgit -c core.editor=true rebase --continue
。 - hoijui您可以使用:
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
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)
和特定请求以不编辑提交消息。
git add .
命令解决项目根目录中的冲突。我想接受所有更改,然后运行git cherry-pick --continue
命令。 - Harald Nordgrengit rebase
时遇到了同样的问题。 - Joseph K. Strauss