推动Squashed子树改变为gerrit

时间:2016-10-28 03:14:17

标签: git gerrit git-subtree

添加子树时:

  

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

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

Squashed 'vendor' changes from 15fc2b6..c6dc29b

和合并提交

Merge commit 'SHA1' into master

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

  

git rebase -i HEAD~2

和rework一样,我做任何其他提交,因为它是一个压扁的提交。

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

1 个答案:

答案 0 :(得分:1)

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

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

git filter-branch --msg-filter接受一个命令来运行,该命令在stdin上传入提交消息,并将新的一个写入stdout。 commit-msg钩子脚本在文件上工作,因此需要一些shell脚本来将原始消息写入文件,运行钩子,然后将文件捕获到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}"