非交互式方式压缩一系列 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" 的内容。
有两件事需要完成。
- 编写脚本或手动压缩连续的内部版本号增量提交
- 更新我的脚本以检查之前的提交 is/are 内部版本号是否增加,如果是,则压缩。
我自己编写脚本没有问题。这个问题的重点是 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
。
我目前正在做一个 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" 的内容。
有两件事需要完成。
- 编写脚本或手动压缩连续的内部版本号增量提交
- 更新我的脚本以检查之前的提交 is/are 内部版本号是否增加,如果是,则压缩。
我自己编写脚本没有问题。这个问题的重点是 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
。