推动Squashed子树改变为gerrit

Liz*_*net 5 git gerrit git-subtree

在添加子树时:

git subtree add --prefix = vendor https://example.com/repo master --squash

创建了两个提交.一个用于压缩子树提交

Squashed 'vendor' changes from 15fc2b6..c6dc29b
Run Code Online (Sandbox Code Playgroud)

和合并提交

Merge commit 'SHA1' into master
Run Code Online (Sandbox Code Playgroud)

当我想将此更改推送到gerrit时,它需要一个changeID.但是git不允许我这样做

git rebase -i HEAD~2

和我做任何其他提交一样的返工,因为它是一个被压扁的提交.

由于这个原因,我无法将这种变化推向格里特.我无法直接将更改提交到头(git)并破坏超模块上的内容.它必须经过构建和测试.任何建议或帮助表示赞赏.

Bri*_*man 2

git filter-branch可以做很多事情,同时更新提交指针,使提交图保持完整。其中之一是运行命令来编辑所有提交消息,例如 Gerrit 的 commit-msg 挂钩。

git filter-branch HEAD...HEAD~1获取 HEAD 中的所有提交,但不获取 HEAD~1,对于 git-subtree 合并来说,这只是合并和压缩提交。

git filter-branch --msg-filter接受一个命令来运行,该命令获取通过管道传输到标准输入的提交消息,并将新的消息写入标准输出。commit-msg 钩子脚本在文件上工作,因此需要一些 shell 脚本来将原始消息写入文件,运行钩子,然后将文件 cat 到 stdout。

我已将这一切放入脚本中,以便在推送到 Gerrit 之前运行:

# This command re-writes the history after doing a git subtree {pull|add}
# to add Gerrit Change-Id lines to the squash commit message.
#
# It assumes that HEAD is the merge commit merging the subtree into HEAD.
# The original HEAD commit will be backed up under refs/original, which
# is helpful if something goes wrong.

set -e
set -o pipefail

GIT_DIR=$(readlink -f "$(git rev-parse --git-dir)")
TMP_MSG="${GIT_DIR}/COMMIT_MSG_REWRITE"

git filter-branch --msg-filter \
  "cat > ${TMP_MSG} && \"${GIT_DIR}/hooks/commit-msg\" ${TMP_MSG} && \
  cat \"${TMP_MSG}\"" HEAD...HEAD~1

rm -rf "${TMP_MSG}"
Run Code Online (Sandbox Code Playgroud)