Ошибка Gerrit при отсутствии Change-Id в сообщениях фиксации
Я настроил ветку в удаленном репозитории и сделал некоторые коммиты на этой ветке. Теперь я хочу объединить удаленную ветвь с удаленным мастером.
в основном следующие операции:
- филиала кассе
- checkout master
- объединить ветку и исправить ошибки слияния
- фиксация
- головка начала нажима: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)
11 ответов
проверьте, есть ли у ваших коммитов Change-Id: ...
в их описаниях. Каждое обязательство должно иметь их.
если нет, используйте git rebase -i
чтобы перефразировать сообщения фиксации и добавить правильные идентификаторы изменений (обычно это SHA1 первой версии проверенной фиксации).
в будущем вы должны установить commit hook, который автоматически добавляет требуемый идентификатор изменения.
выполнить scp -p -P 29418 username@your_gerrit_address:hooks/commit-msg .git/hooks/
в каталог
или загрузить их с
http://your_gerrit_address/tools/hooks/commit-msg
и копию .git / hooks
попробуйте это:
git commit --amend
затем скопируйте и вставьте Change-Id: I55862204ef71f69bc88c79fe2259f7cb8365699a
в конце файла.
сохранить и нажимаем ее!
Если вам нужно добавить Change-Id к нескольким коммитам, вы можете загрузить крюк с вашего сервера Gerrit и запустить эти команды, чтобы добавить Change-ID ко всем коммитам, которые нуждаются в них сразу. В приведенном ниже примере исправлены все фиксации на текущей ветви, которые еще не были перемещены в восходящую ветвь.
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
это потому, что Gerrit настроен на требование идентификатора изменения в сообщениях фиксации.
http://gerrit.googlecode.com/svn-history/r6114/documentation/2.1.7/error-missing-changeid.html
вы должны изменить сообщения каждого коммита, который вы нажимаете для включения изменить код ( используя git filter-branch
) и только потом нажать.
вы можете быть администратором, выполняющим одноразовый толчок прямо в refs/changes/<change_number>
.
например, как только фиксация без идентификатора изменения приземлилась в Subversion, вы вытаскиваете ее из Subversion с помощью git-svn, и вы хотите архивировать ее как набор исправлений Gerrit в изменение Gerrit.
Если это так, вы можете перейти на страницу настроек проекта (http: / / [путь установки] / # / admin / проекты / [project-id]) и временно измените значение "Require Change-Id in commit message" на False.
Не забудьте впоследствии изменить его обратно на наследование или True!
Проверьте git РЕПО перед совершением
gitrepo/.git/hooks/commit-msg
если этот файл отсутствует в этом месте, вы получите эту ошибку "отсутствует идентификатор изменения в сообщении фиксации".
чтобы решить эту проблему, просто скопируйте вставку фиксации .папка git.
Я тоже получил это сообщение об ошибке.
и что заставляет меня думать, что полезно дать ответ здесь, так это то, что ответ от @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
мы решили эту проблему сегодня утром путем повторного клонирования репозитория и повторного применения изменений. Это самый простой способ повторно синхронизировать локальную копию с Gerrit. Как всегда, сначала мы создали резервную копию.
хотя есть ряд других дико сложных решений, его часто выгодно использовать простой подход, чтобы избежать ухудшения ситуации.
вам нужно следовать под инструкциями 2 шагов:
[проблема] remote: подсказка: чтобы автоматически вставить Change-Id, установите крюк:
1) gitdir=$(git rev-parse --git-dir);
2) scp -p -P 29418 <username>@gerrit.xyz.se:hooks/commit-msg ${gitdir}/hooks/
обычно $gitdir = ".мерзавец." Вам нужно обновить имя пользователя и ссылку Геррит.
1) gitdir=$(git rev-parse --git-dir);
2) scp -p -P 29418 <username>@gerrit.xyz.se:hooks/commit-msg ${gitdir}/hooks/
a) я не знаю, как выполнить Шаг 1 в windows, поэтому пропустил его и использовал жестко закодированный путь в step 2 scp -p -P 29418 <username>@gerrit.xyz.se:hooks/commit-msg .git/hooks/
b) в случае, если вы получите ниже ошибки, вручную создайте каталог "крючки".папку с Git
protocol error: expected control record
c) если у вас есть подмодуль, скажем, "XX", тогда вам нужно повторить шаг 2 и на этот раз заменить ${gitdir} на этот путь подмодулей
d) в случае, если scp не распознается windows, дайте полный путь scp
"C:\Program Files\Git\usr\bin\scp.exe"
e).папка git присутствует в вашем РЕПО проекта, и это скрытая папка
Это также может произойти, если у вас есть такое ограничение:
введите сообщение для вашего изменения. Строки, начинающиеся с"#", будут проигнорированы, и пустое сообщение прерывает фиксацию.
и я вам нравлюсь: напишите сообщение фиксации, начинающееся с"#".....
у меня была такая же ошибка, но у меня уже была commit-msg
и не rebase
и все. Очень глупая ошибка, хотя: D