添加子树时:
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)并破坏超模块上的内容。它必须经过构建和测试。任何建议或帮助表示赞赏。
答案 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}"