非交互式方式压缩一系列 git 提交不是从 HEAD 开始

Non-interactive way to squash a range of git commits not starting from HEAD

我目前正在做一个 iOS 项目。我有一个脚本,当我构建时,它 运行s。此脚本更新内部版本号并将其提交到 git 并推送它。然而,在使用了几天之后,我意识到了一个副作用。我可以在递增内部版本号的地方进行连续提交。所以我的提交日志中充斥着这些提交。由于该项目被分解为几个核心库,因此这种情况尤其严重。因此,在库上工作总是会导致构建增量(因为它是相同的工作区)。

我现在意识到我需要一个足够聪明的脚本来压缩连续提交,这些提交是内部版本号的更新。

运行

git log -20 --pretty=format:"%h - %s"

例如,将产生

6add12a1 - Update the package from handle
70f438be - Updated client version to 0.15.0.2152 and next version to 0.15.0.2153
7d84151f - Updated client version to 0.15.0.2151 and next version to 0.15.0.2152
eace113b - Updated client version to 0.15.0.2150 and next version to 0.15.0.2151
e72624dd - Updated client version to 0.15.0.2149 and next version to 0.15.0.2150
85d15b6c - Updated client version to 0.15.0.2148 and next version to 0.15.0.2149
a4e140cd - Updated client version to 0.15.0.2147 and next version to 0.15.0.2148
ffb18892 - Updated client version to 0.15.0.2146 and next version to 0.15.0.2147
ebd33432 - Updated client version to 0.15.0.2145 and next version to 0.15.0.2146
f0727ca7 - Updated client version to 0.15.0.2144 and next version to 0.15.0.2145
80ab2939 - Adjust balance if FB rewards popup is shown
0c04a1d7 - Updated client version to 0.15.0.2143 and next version to 0.15.0.2144
e89fd769 - Updated client version to 0.15.0.2142 and next version to 0.15.0.2143
c404f9ce - Updated client version to 0.15.0.2141 and next version to 0.15.0.2142
3911fb31 - Updated client version to 0.15.0.2140 and next version to 0.15.0.2141
ee3b7056 - Updated client version to 0.15.0.2139 and next version to 0.15.0.2140
cfb3b2a7 - Updated client version to 0.15.0.2138 and next version to 0.15.0.2139
a11fa3d9 - Add conditionals compilation to remove some logging
b9d0f75a - Disable backlight
ba4447ae - Updated client version to 0.15.0.2137 and next version to 0.15.0.2138

所以在这个例子中,我想将 70f438be 压缩为 f0727ca7,然后将提交更新为类似 "Updated client version from 0.15.0.2138 to 0.15.0.2152" 的内容。

有两件事需要完成。

我自己编写脚本没有问题。这个问题的重点是 git 命令本身。有关脚本的详细信息作为上下文提供。

我正在寻找的是如何使用 git 非交互地压缩不是从 HEAD 开始的特定连续提交范围。到目前为止,我看到的所有参考资料都从 HEAD 压缩了。

比如这个

Is there a way to squash a number of commits non-interactively?.

今天晚些时候我会再看一遍,因为它可能仍然包含答案。

哦,是的,澄清一下,这些提交都已经推送了。

请注意,这是在 Mac 上。后一个脚本是来自 Xcode(构建阶段)的 运行 并且是一个使用 GitPython.

的 Python 脚本

好的,所以我做了一些实验 运行 一段时间后,我想出了一个解决方案。

如果 git-fu 的人可以验证这确实是一个 good/safe 的方法,那将会很有帮助。

我放弃了尝试更改提交消息以反映更改。我确实找到了一种方法来做到这一点,但由于我现在对这一切对存储库的影响有了更好的了解,所以我选择不担心这个细节。

这个命令似乎可以压缩 运行ge 不是从 HEAD 开始的提交。

git rebase -Xtheirs --onto 80ab2939 7d84151f

这里的关键是 -Xtheirs 因为至少在我的应用程序中,否则会导致冲突。请注意,我的情况很特殊,因为它依赖于已知的提交消息模式并且文件是相同的。

我运行以上这段历史

6add12a1 - Update the package from handle
70f438be - Updated client version to 0.15.0.2152 and next version to 0.15.0.2153
7d84151f - Updated client version to 0.15.0.2151 and next version to 0.15.0.2152
eace113b - Updated client version to 0.15.0.2150 and next version to 0.15.0.2151
e72624dd - Updated client version to 0.15.0.2149 and next version to 0.15.0.2150
85d15b6c - Updated client version to 0.15.0.2148 and next version to 0.15.0.2149
a4e140cd - Updated client version to 0.15.0.2147 and next version to 0.15.0.2148
ffb18892 - Updated client version to 0.15.0.2146 and next version to 0.15.0.2147
ebd33432 - Updated client version to 0.15.0.2145 and next version to 0.15.0.2146
f0727ca7 - Updated client version to 0.15.0.2144 and next version to 0.15.0.2145
80ab2939 - Adjust balance if FB rewards popup is shown
0c04a1d7 - Updated client version to 0.15.0.2143 and next version to 0.15.0.2144

这会生成一些输出:

First, rewinding head to replay your work on top of it...
Auto-merging resources/plists/jks-info.plist
Auto-merging resources/next_build_version.txt
[detached HEAD 8beac4c7] Updated client version to 0.15.0.2152 and next version to 0.15.0.2153
 Date: Mon Mar 4 02:01:15 2019 -0800
 2 files changed, 2 insertions(+), 2 deletions(-)
Committed: 0001 Updated client version to 0.15.0.2152 and next version to 0.15.0.2153
[detached HEAD 4ede3d58] Update the package from handle
 Date: Mon Mar 4 02:03:09 2019 -0800
 1 file changed, 4 insertions(+), 2 deletions(-)
Committed: 0002 Update the package from handle
All done

但是生成的历史记录 (git log) 很好。

4ede3d58 - Update the package from handle
8beac4c7 - Updated client version to 0.15.0.2152 and next version to 0.15.0.2153
80ab2939 - Adjust balance if FB rewards popup is shown
0c04a1d7 - Updated client version to 0.15.0.2143 and next version to 0.15.0.2144
e89fd769 - Updated client version to 0.15.0.2142 and next version to 0.15.0.2143

我的最后一步是强制推送,因为提交已经被推送。请注意,强制推送将重写您的历史记录。为了安全起见,我实际上使用git push --force-with-lease