将Change-Id添加到所有提交

时间:2014-05-19 12:17:12

标签: git gerrit

我刚刚安装了Gerrit并且我想对它进行推动,但是我收到了关于Change-Id的错误,但它似乎是在它正在抱怨的提交中。< / p>

$ git push gerrit HEAD:refs/publish/my-branch
Counting objects: 28, done.
Delta compression using up to 4 threads.
Compressing objects: 100% (15/15), done.
Writing objects: 100% (15/15), 4.46 KiB, done.
Total 15 (delta 12), reused 0 (delta 0)
remote: Resolving deltas: 100% (12/12)
remote: Processing changes: refs: 1, done    
remote: ERROR: missing Change-Id in commit message footer
remote: Suggestion for commit message:
remote: Revert "Refactoring controllers"
remote: 
remote: This reverts commit dd1c5c86b12461f61326fd102a11d9e3cb51142e.
remote: 
remote: Change-Id: Iaacf80a9e4f56b58d0b648112c3eb2413988f00e
remote: 
remote: Hint: To automatically insert Change-Id, install the hook:
remote:   gitdir=$(git rev-parse --git-dir); scp -p -P 29418 user@ci:hooks/commit-msg ${gitdir}/hooks/
remote: 
remote: 
To ssh://user@ci:29418/Project
! [remote rejected] HEAD -> refs/publish/my-branch (missing Change-Id in commit message footer)
error: failed to push some refs to 'ssh://user@ci:29418/Project'

我认为这是因为之前的提交没有Change-Id,因为它们是在钩子之前制作的。如何更新所有以前的提交以添加Change-Id

5 个答案:

答案 0 :(得分:2)

在Gerrit中 - 在项目设置页面中禁用临时提交需要更改ID的选项。然后将现有的提交推送到Gerrit。

答案 1 :(得分:1)

当您有钩子时,您可以在交互模式下将rebase分支转换为自身

git checkout branchName
git rebase -i branchName

当您看到每个提交附近的交互式菜单更改关键字pickedit时,您没有更改ID。然后git将在“重新标记”每个标记为edit的提交之前停止。在每个站点执行git commit --amend,保存更改(更改ID将自动添加,如果您有提交钩子,不需要手动添加),然后git rebase --continue。之后,您的分支中的每个提交都将具有change-id Rince并重复你需要的每个分支。

答案 2 :(得分:0)

正如this question所述。您需要使用git filter-branch --msg-filter来模拟创建Change-ID

的过程

基本上你想创建一个新的孤儿分支(没有先前的历史记录),然后重写所有提交以获得Change-ID。

您需要的具体代码示例(逐字回答previously mentioned

#create an orphan branch "tmp" from "master".
git checkout --orphan tmp master
git commit -m 'new root'
#cherry-pick all the commits from an upstream kernel branch.
git cherry-pick <all-the-commits>
#rewrite the commit message of every commit on "tmp"
git filter-branch --msg-filter 'git log -1 --pretty=%B $GIT_COMMIT > msg.txt;~/commit-msg msg.txt;cat msg.txt'
#all the commits now have Change-Id
#cherry-pick all of them except the root to "master"
root=$(git log --pretty=%H --max-parents=0)
git checkout master
git cherry-pick $root..tmp

答案 3 :(得分:0)

该问题的所有答案似乎都比所需的复杂。我想提出一个HaoZeke答案的完善且(希望)更简单的版本。 首先,我假设像Gerrit指令(Socket s = null; SocketFactory sf = tlsCert.getSslContext().getSocketFactory(); s = (SSLSocket) sf.createSocket("127.0.0.1", 1441); ((SSLSocket)s).setNeedClientAuth(true); 一样,已经安装了Change-Id添加消息挂钩。

然后只需一次git调用就足以将其应用于所需范围内的所有提交:

Hint: To automatically insert Change-Id, install the hook: ...

答案 4 :(得分:0)

在@Asprelis的答案的基础上,我发现了一个单行命令,该命令可以在指定范围内对所有提交进行重新设置基准并进行修正,而无需在交互模式下浪费时间:

git rebase -f HEAD~<num_of_commits> <branch> --exec "git commit --amend --no-edit"

说明:

根据git文档位于: https://git-scm.com/docs/git-rebase

-f强制git rebase设置为“分别重播所有已重定的提交,而不是快速转发未重定的提交。这确保了已重定分支的整个历史记录都由新的提交组成”

和--exec“在最终历史记录中创建提交的每一行之后,追加“ exec”。将被解释为一个或多个shell命令。”

因此,简而言之,该命令告诉git rebase重写并在您要重新建立基础的每个提交上执行git commit --amend --no-edit

如果安装了gerrit“ commit-msg”挂钩,则会在每个提交中插入一个Change ID。