自动选择在 Git rebase 过程中需要编辑的 SHA。

3

我有一个分支,其中包含几十个提交记录,最近已经在master的基础上进行了变基。在解决冲突时发生了一些错误,现在需要编辑其中六个提交记录。

需要编辑的SHA列表可以通过以下方式找到:

$ git log --format=format:%H master..branch-in-question -- file/path

这可以与git rebase -i一起使用,以便逐个选择每个提交进行edit(这样做可能比花时间询问此问题要快,但我相信您都明白)。我的问题是是否可以将上面的git log中的sha列表传递给git rebase,并自动选择这些提交进行edit

1个回答

4
我不知道有没有内置的方法可以做到这一点,但我有一个解决方法,应该可以节省您一些时间
首先,启动交互式变基:
git rebase -i

将第一个提交的命令从pick更改为edit,然后保存并退出。

运行此脚本:

#!/bin/bash

for sha in $(git log --format=format:%H master..branch-in-question -- file/path)
do
  sha=${sha:0:7}
  sed -i "s/pick $sha/edit $sha/" .git/rebase-merge/git-rebase-todo
done

然后执行:

git rebase --continue

这将立即暂停变基,将手动编辑的修改应用到待办事项文件中,并继续执行。您无法提前创建待办事项文件,因为这样做会导致Git认为您已经开始了变基。
感谢@torek的帮助,我有一种自动化的方法。将脚本修改如下:
#!/bin/bash

# editor=$(git config --get core.editor);
# editor=${editor:-${VISUAL:-${EDITOR:-vi}}};
for sha in $(git log --format=format:%H master..branch-in-question -- file/path)
do
  sha=${sha:0:7}
  sed -i "s/pick $sha/edit $sha/" $@
done

# $editor $@

如果你想在运行变基之前修改待办事项文件,请取消注释editor行。

然后,启动变基:

GIT_SEQUENCE_EDITOR=/path/to/script.sh git rebase -i

这将自动更改命令,使你的命令输出的所有提交的命令从pick更改为edit,无需手动更改第一个提交。

这个脚本的两个版本都不允许你自定义计算使用哪些提交的命令,但如果这是一个问题,你可以传入一个环境变量来允许这样的自定义。


2
你可以修改这个脚本来对作为参数提供的文件进行编辑,然后运行$editor(从core.editor、$VISUAL或$EDITOR或vi中设置),然后将GIT_SEQUENCE_EDITOR设置为git rebase -i中的脚本。 这依赖于命令序列由$GIT_SEQUENCE_EDITOR编辑,而提交由core.editor编辑的事实。(两者都会回退到${VISUAL:-${EDITOR:-vi}}。) - torek
1
我可能过度压缩了这个想法。在你的脚本中:editor=$(git config --get core.editor); editor=${editor:-${VISUAL:-${EDITOR:-vi}}}; <sed stuff>; $editor "$@"。然后 GIT_SEQUENCE_EDITOR=<path to your script> git rebase -i <args> 将会做 OP 想要的事情,只要稍微修改一下你的脚本来编辑 "$@",就不需要先进行一次 pick-to-edit 了。为了处理旧版本 Git 中 rebase-todo 不在 .git/rebase-merge/ 中的情况,使用 "$@" 来定位命令文件。 - torek
1
好的,第二项是有意的 - 如果您不想要它,请省略最后一个 $editor 调用(然后您可以省略第一次设置本地变量 $editor)。不确定是什么原因导致最后一个 "pick" 没有更改。也许值得留下一些调试轨迹和/或构建一个一次性编辑脚本,以便您可以只运行 sed 一次,这两者都将有助于解决第一项问题。(无论如何,这对于可能是一次性任务的工作来说是很多工作 https://xkcd.com/1319/ :-) ) - torek
1
我实际上是在寻找调味品传递的xkcd https://xkcd.com/974/,但我认为我找到的这个更加合适。 :-) - torek
1
使用新的break指令,在第一次提交之前而不是编辑第一次提交,这样你也可以捕获它 :) - DylanYoung
显示剩余4条评论

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