如何在gerrit中修改已提交的change
Posted
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了如何在gerrit中修改已提交的change相关的知识,希望对你有一定的参考价值。
1、将版本库repos/hooks/pre-revprop-change.tmp修改成pre-revprop-change2、为pre-revprop-change加上执行权限:使用命令chmod+x3、修改pre-revprop-change#!/bin/sh#PRE-REVPROP-CHANGEHOOK##Thepre-revprop-changehookisinvokedbeforearevisionproperty#isadded,modifiedordeleted.Subversionrunsthishookbyinvoking#aprogram(script,executable,binary,etc.)named'pre-revprop-change'#(forwhichthisfileisatemplate),withthefollowingordered#arguments:##[1]REPOS-PATH(thepathtothisrepository)#[2]REVISION(therevisionbeingtweaked)#[3]USER(theusernameofthepersontweakingtheproperty)#[4]PROPNAME(thepropertybeingsetontherevision)#[5]ACTION(thepropertyisbeing'A'dded,'M'odified,or'D'eleted)##[STDIN]PROPVAL**thenewpropertyvalueispassedviaSTDIN.##Ifthehookprogramexitswithsuccess,thepropchangehappens;but#ifitexitswithfailure(non-zero),thepropchangedoesn'thappen.#Thehookprogramcanusethe'svnlook'utilitytoexaminethe#existingvalueoftherevisionproperty.##WARNING:unlikeotherhooks,thishookMUSTexistforrevision#propertiestobechanged.Ifthehookdoesnotexist,Subversion#willbehaveasifthehookwerepresent,butfailed.Thereason#forthisisthatrevisionpropertiesareUNVERSIONED,meaningthat#asuccessfulpropchangeisdestructive;theoldvalueisgone#forever.Werecommendthehookbackuptheoldvaluesomewhere.##OnaUnixsystem,thenormalprocedureistohave'pre-revprop-change'#invokeotherprogramstodotherealwork,thoughitmaydothe#workitselftoo.##Notethat'pre-revprop-change'mustbeexecutablebytheuser(s)whowill#invokeit(typicallytheuserhttpdrunsas),andthatusermust#havefilesystem-levelpermissiontoaccesstherepository.##OnaWindowssystem,youshouldnamethehookprogram#'pre-revprop-change.bat'or'pre-revprop-change.exe',#butthebasicideaisthesame.##Thehookprogramtypicallydoesnotinherittheenvironmentof#itsparentprocess.Forexample,acommonproblemisforthe#PATHenvironmentvariabletonotbesettoitsusualvalue,so#thatsubprogramsfailtolaunchunlessinvokedviaabsolutepath.#Ifyou'rehavingunexpectedproblemswithahookprogram,the#culpritmaybeunusual(ormissing)environmentvariables.##Hereisanexamplehookscript,foraUnix/bin/shinterpreter.#Formoreexamplesandpre-writtenhooks,seethosein#theSubversionrepositoryat#REPOS="$1"REV="$2"USER="$3"PROPNAME="$4"ACTION="$5"if["$USER"!=$(/usr/bin/svnlookauthor-r"$2""$1")];then#判断是否为本人提交的日志echo"authorerror!">$2exit1elif["$ACTION"="M"-a"$PROPNAME"="svn:log"];then#只能修改日志,不可修改作者exit0;fiecho"Changingrevisionpropertiesotherthansvn:logisprohibited">&2exit14、测试$svnpropedit-rN--revpropsvn:logURL(URL可省)$svnpropset-rN--revpropsvn:log"newlogmessage"URL 参考技术A gerrit的审核机制决定了提交到远程到代码并非远程master分支,而是/refs/for/master分支,所以需要解决怎么在sourcetree下提交代码到/refs/for/master分支在git代码目录下运行:gitconfigremote.origin.pushrefs/heads/*:refs/for/*缺少提交消息中的 Change-Id 时出现 Gerrit 错误
【中文标题】缺少提交消息中的 Change-Id 时出现 Gerrit 错误【英文标题】:Gerrit error when Change-Id in commit messages are missing 【发布时间】:2012-02-09 08:47:44 【问题描述】:我在远程存储库中建立了一个分支,并在该分支上进行了一些提交。 现在我想将远程分支合并到远程master。
基本上以下是我的操作:
-
结帐分行
结帐大师
合并分支并修复合并错误
提交
推源 HEAD:refs/for/master
但在第 5 步得到错误消息:
remote: Resolving deltas: 0% (0/12)
remote: ERROR: missing Change-Id in commit message
...
remote: Change-Id: I55862204ef71f69bc88c79fe2259f7cb8365699a
To ssh://prc@test.gerrit.xxx.com:29418/hello_git
! [remote rejected] HEAD -> refs/for/master (missing Change-Id in commit message)
【问题讨论】:
就像 git promot:gitdir=$(git rev-parse --git-dir); scp -p -P 29418 user@host:hooks/commit-msg $gitdir/hooks/
然后git commit --amend --no-edit
。
@Galley,我认为这是针对上面发布的问题的最简单的解决方案。我想根据终端上 git 的建议与 SO 确认。它对我有用。
【参考方案1】:
检查您的提交是否在其描述中包含Change-Id: ...
。每个提交都应该有它们。
如果不是,请使用 git rebase -i
改写提交消息并添加正确的 Change-Id(通常这是已审核提交的第一个版本的 SHA1)。
以后你应该安装commit hook,它会自动添加所需的Change-Id。
在仓库目录中执行scp -p -P 29418 username@your_gerrit_address:hooks/commit-msg .git/hooks/
或从
http://your_gerrit_address/tools/hooks/commit-msg
并复制到 .git/hooks
【讨论】:
我发现如果您添加例如,Gerrit 可能会错过 Change-Id:在它下面有一个“冲突:”行。所以请确保它在提交的最后一行。 @qneill 听起来像是一个错误,你能把它报告给 Gerrit 开发者吗? @RafałRawicki:按照设计,Gerrit(实际上是 JGit)只识别提交消息最后一段中的“Key: Value”页脚行。 Gerrit 无法帮助添加 Git 添加的“冲突:”行。如果消息末尾和“Change-Id:”行下方有“Conflict:”行,则更改 commit-msg 挂钩以发出警告或退出可能是可行的。 我使用git log
找到了changedId,但仍然出现同样的错误。
从your_gerrit_address/tools/hooks/commit-msg 下载并复制到 .git/hooks 对我有用。感谢 Rafal 的精彩回答。【参考方案2】:
试试这个:
git commit --amend
然后将Change-Id: I55862204ef71f69bc88c79fe2259f7cb8365699a
复制粘贴到文件末尾。
保存并再次推送!
【讨论】:
这是一个快速修复,但提供了“正确”答案@Rafał Rawicki 像魅力一样工作。只需在提交注释下添加 ChangeId: XXXXXXX 即可。这比其他解决方案更容易,必须投票作为答案。【参考方案3】:如果您需要将 Change-Id 添加到多个提交,您可以从 Gerrit 服务器下载钩子并运行这些命令以将 Change-Ids 添加到一次需要它们的所有提交中。下面的示例修复了当前分支上尚未推送到上游分支的所有提交。
tmp=$(mktemp)
hook=$(readlink -f $(git rev-parse --git-dir))/hooks/commit-msg
git filter-branch -f --msg-filter "cat > $tmp; \"$hook\" $tmp; cat $tmp" @u..HEAD
【讨论】:
你能解释一下如何运行它吗? 将此内容复制到文件并作为 shell 脚本运行。 这对我不起作用,它说我没有配置上游。你能解释一下你在这里做什么吗?另外,readlink -f
不能在 mac 上运行。
@u
是一种快速引用您正在跟踪并应该推送到的上游分支的方法。如果由于某种原因没有跟踪上游分支,则可以使用完整的 ref 名称代替 @u
,例如 origin/foo
。您也可以使用 Git 提供的命令设置上游,例如 git branch -u origin/foo
。 @u..HEAD
只是指定要重写的提交范围,因此您可以使用任何您喜欢的格式来指定范围。
对我来说,上面的脚本返回Found nothing to rewrite
。在我的情况下,如何将其更改为将Change-Id
添加到每个提交消息中:***.com/q/52321292/630169。谢谢!【参考方案4】:
这是因为 Gerrit 被配置为在提交消息中需要 Change-Id。
http://gerrit.googlecode.com/svn-history/r6114/documentation/2.1.7/error-missing-changeid.html
您必须更改要推送的每个提交的消息以包含更改 ID(使用 git filter-branch
),然后才推送。
【讨论】:
我运行 git commit --amend 来修复提交日志消息:以下是当前日志消息:commit 8152da05ce0235cb779620410474731868664296 作者:PRC您可能是一名管理员,直接向refs/changes/<change_number>
进行一次性推送。
例如,一旦没有 Change-Id 的提交进入 Subversion,您可以使用 git-svn 将其从 Subversion 中拉出,并且您希望将其作为 Gerrit 补丁集存档到 Gerrit 更改中。
如果是这样,您可以转到项目设置页面 (http://[installation-path]/#/admin/projects/[project-id]) 并将“提交消息中需要更改 ID”值临时更改为 False。
不要忘记之后将其改回 Inherit 或 True!
【讨论】:
【参考方案6】:在提交之前检查你的 git 仓库
gitrepo/.git/hooks/commit-msg
如果该位置不存在此文件,则您将收到此错误“提交消息中缺少 Change-Id”。
要解决这个问题,只需将提交钩子复制粘贴到 .git 文件夹中即可。
【讨论】:
【参考方案7】:您需要按照以下两步说明进行操作:
[Issue] remote:提示:要自动插入 Change-Id,请安装 hook:
1)gitdir=$(git rev-parse --git-dir);
2) scp -p -P 29418 <username>@gerrit.xyz.se:hooks/commit-msg $gitdir/hooks/
通常 $gitdir = ".git"。您需要更新用户名和 Gerrit 链接。
【讨论】:
【参考方案8】:1) gitdir=$(git rev-parse --git-dir);
2) scp -p -P 29418 <username>@gerrit.xyz.se:hooks/commit-msg $gitdir/hooks/
a) 我不知道如何在 windows 中执行第 1 步,所以跳过它并使用step 2 scp -p -P 29418 <username>@gerrit.xyz.se:hooks/commit-msg .git/hooks/
中的硬编码路径
b) 如果遇到以下错误,请在 .git 文件夹中手动创建“hooks”目录
protocol error: expected control record
c) 如果你有子模块,比如说“XX”,那么你也需要在那里重复步骤 2,这次用那个子模块路径替换 $gitdir
d) 如果 Windows 无法识别 scp,请给出 scp 的完整路径
"C:\Program Files\Git\usr\bin\scp.exe"
e) .git 文件夹存在于您的项目仓库中,它是隐藏文件夹
【讨论】:
【参考方案9】:在我的 .git/hooks 文件夹下,一些示例文件丢失了。像 commit-msg,post-commit.sample,post-update.sample...添加这些文件解决了我的更改 ID 丢失问题。
【讨论】:
【参考方案10】:默认情况下,如果没有提供 Change-Id,Gerrit 将阻止推送审查。 Change-Id 被添加到客户端提交消息的页脚。您必须在开始时下载并设置 commit-msg 脚本。您可以在 Gerrits 文档中找到更多信息。
git clone ssh://gerrithost:29418/RecipeBook.git RecipeBook
scp -p -P 29418 gerrithost:hooks/commit-msg RecipeBook/.git/hooks/
chmod u+x .git/hooks/commit-msg
【讨论】:
【参考方案11】:我也收到此错误消息。
让我认为在这里给出答案很有用的是,@Rafał Rawicki 的答案在某些情况下是一个很好的解决方案,但并非适用于所有情况。 我遇到的例子:
1.run "git log" we can get the HEAD commit change-id
2.we also can get a 'HEAD' commit change-id on Gerrit website.
3.they are different ,which makes us can not push successfully and get the "missing change-id error"
解决方案:
0.'git add .'
1.save your HEAD commit change-id got from 'git log',it will be used later.
2.copy the HEAD commit change-id from Gerrit website.
3.'git reset HEAD'
4.'git commit --amend' and copy the change-id from **Gerrit website** to the commit message in the last paragraph(replace previous change-id)
5.'git push *' you can push successfully now but can not find the HEAD commit from **git log** on Gerrit website too
6.'git reset HEAD'
7.'git commit --amend' and copy the change-id from **git log**(we saved in step 1) to the commit message in the last paragraph(replace previous change-id)
8.'git push *' you can find the HEAD commit from **git log** on Gerrit website,they have the same change-id
9.done
【讨论】:
【参考方案12】:我们今天早上通过重新克隆存储库并重新应用更改解决了这个问题。这是将本地副本与 Gerrit 重新同步的最简单方法。与往常一样,我们首先创建了备份。
尽管还有许多其他极其复杂的解决方案,但采用简单的方法来避免使事情变得更糟通常是有利的。
【讨论】:
【参考方案13】:如果您有此限制,也会发生这种情况:
请输入您的更改的提交消息。以“#”开头的行将被忽略,并且一条空消息中止提交。
你确实喜欢我:写一个以“#”开头的提交消息.....
我遇到了同样的错误,但我已经有了commit-msg
并做了rebase
和所有操作。非常愚蠢的错误:D
【讨论】:
问题没有提到这个错误信息,这个答案并没有真正回答问题。以上是关于如何在gerrit中修改已提交的change的主要内容,如果未能解决你的问题,请参考以下文章