Ошибка Gerrit, когда Change-Id в сообщениях фиксации отсутствует

Я создал ветку в удаленном репозитории и сделал несколько коммитов в этой ветке. Теперь я хочу объединить удаленную ветку с удаленным мастером.

В основном следующие мои операции:

  1. кассовое отделение
  2. кассовый мастер
  3. объединить ветку и исправить ошибки слияния
  4. совершить
  5. push origin 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://[email protected]:29418/hello_git
 ! [remote rejected] HEAD -> refs/for/master (missing Change-Id in commit message)

person Pan Ruochen    schedule 13.01.2012    source источник
comment
просто сделайте как git promot:gitdir=$(git rev-parse --git-dir); scp -p -P 29418 user@host:hooks/commit-msg ${gitdir}/hooks/ затем git commit --amend --no-edit.   -  person Galley    schedule 29.05.2019
comment
@Galley, я думаю, что это самое простое решение проблемы, описанной выше. Я хотел подтвердить с помощью SO то, что предлагает git на терминале. Меня устраивает.   -  person saichand    schedule 25.08.2020


Ответы (12)


Проверьте, есть ли в описании ваших коммитов Change-Id: .... Они должны быть у каждого коммита.

Если нет, используйте git rebase -i, чтобы переформулировать сообщения коммита и добавить правильные идентификаторы изменений (обычно это SHA1 первой версии проверенного коммита).

На будущее следует установить хук фиксации, который автоматически добавляет требуемый 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

person Rafał Rawicki    schedule 13.01.2012
comment
Я обнаружил, что Change-Id: может быть пропущен Герритом, если вы добавите, например. a Конфликт: строка под ним. Поэтому убедитесь, что он находится в последней строке коммита. - person qneill; 10.05.2012
comment
@qneill Похоже на ошибку, не могли бы вы сообщить об этом разработчику Gerrit? - person Rafał Rawicki; 10.05.2012
comment
@RafałRawicki: по дизайну Gerrit (на самом деле, JGit) распознает только строки нижнего колонтитула Key: Value в последнем абзаце сообщения фиксации. Геррит не может помочь, что строки Conflict:, которые добавляет Git, добавляются. Что может быть осуществимо, так это изменить хук commit-msg, чтобы предупредить или выручить, если есть строки Conflict: в конце сообщения и ниже строки Change-Id:. - person Magnus Bäck; 05.01.2014
comment
Я нашел измененный идентификатор с помощью git log, но все равно получаю ту же ошибку. - person jiashie; 14.10.2014
comment
загрузка с your_gerrit_address/tools/hooks/commit-msg и копирование в .git/hooks работали для меня. Спасибо Рафалю за отличный ответ. - person shridutt kothari; 03.07.2015
comment
Change-Id: -- должен быть в последней строке, однако строки комментариев НЕ считаются строками - person serup; 05.04.2016
comment
Это сводится к добавлению строки Change-Id: I<your_commit_sha-1> в конце сообщения коммита. Подробности можно найти в документации: ссылка - person Dominik; 06.09.2016
comment
Нужно ли исправлять все предыдущие коммиты, сделанные в репозитории git (до создания gerrit)? - person hemantvsn; 12.04.2017
comment
Не могли бы вы рассказать подробнее о том, как сделать rebase? Я не могу заставить его работать. В Интернете нет ресурсов по этому вопросу, у gerrit также нет полезных документов. - person Tomáš Zato - Reinstate Monica; 09.06.2017
comment
второй вариант отлично работает для меня. Потрясающий! спасибо - person asitis; 25.06.2018
comment
Непонятно про git rebase -i - как его использовать? Перед этим создать новую пустую ветку? Если я уже установил хук commit-msg, могу ли я просто сделать git rebase, чтобы повторить все изменения, автоматически добавляя Change-Id: к каждому сообщению фиксации? - person Aleksey Kontsevich; 13.09.2018

Попробуй это:

git commit --amend

Затем скопируйте и вставьте Change-Id: I55862204ef71f69bc88c79fe2259f7cb8365699a в конец файла.

Сохраните его и нажмите еще раз!

person vailaya shreesha    schedule 11.06.2013
comment
Это работает как быстрое решение, но предоставляется «правильный» ответ @Rafał Rawicki - person HockeyJ; 02.08.2017
comment
Работает как шарм. Просто нужно было добавить ChangeId: XXXXXXX под комментарием коммита. Это намного проще, чем другие решения, и за него нужно проголосовать как за ответ. - person Sammy; 02.08.2018

Если вам нужно добавить 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
person Matt Cowell    schedule 12.09.2014
comment
Можете ли вы объяснить, как это запустить? - person user963935; 02.10.2014
comment
скопируйте это содержимое в файл и запустите его как сценарий оболочки. - person tmp120210; 25.06.2015
comment
Это не работает для меня, оно говорит, что у меня нет настроенного восходящего потока. Не могли бы вы объяснить, что вы здесь делаете? Кроме того, readlink -f не работает на Mac. - person Emma Strubell; 04.08.2016
comment
@{u} — это быстрый способ сослаться на отслеживаемую вышестоящую ветку, на которую следует нажать. Если вы по какой-то причине не отслеживаете восходящую ветвь, вместо @{u} можно использовать полное имя ссылки, например origin/foo . В качестве альтернативы вы можете настроить восходящий поток с помощью команды, предоставленной Git, например git branch -u origin/foo. @{u}..HEAD просто указывает диапазон коммитов для перезаписи, поэтому вы можете использовать любой формат для указания диапазона. - person Matt Cowell; 16.08.2016
comment
Для меня приведенный выше скрипт возвращает Found nothing to rewrite. Как изменить его, чтобы добавить Change-Id к каждому сообщению фиксации в моем случае: stackoverflow.com/q/52321292/630169. Спасибо! - person Aleksey Kontsevich; 13.09.2018

Это связано с тем, что Gerrit настроен на требование Change-Id в сообщениях фиксации.

http://gerrit.googlecode.com/svn-history/r6114/documentation/2.1.7/error-missing-changeid.html

Вы должны изменить сообщения каждого коммита, который вы отправляете, чтобы включить идентификатор изменения (используя git filter-branch ), и только затем отправляете.

person manojlds    schedule 13.01.2012
comment
Я запускаю git commit --amend, чтобы исправить сообщение журнала фиксации: Вот текущие сообщения журнала: master Change-Id: I70aee922f6310e4766eb15694deb2fb3579ed042 Но я все еще не могу отправить ветку на мастер с теми же ошибками. - person Pan Ruochen; 13.01.2012

Вы можете быть администратором, выполняющим одноразовую отправку непосредственно в refs/changes/<change_number>.

Например, когда фиксация без Change-Id попала в Subversion, вы вытаскиваете ее из Subversion с помощью git-svn и хотите заархивировать ее как набор исправлений Gerrit в изменение Gerrit.

Если это так, вы можете перейти на страницу настроек проекта (http://[installation-path]/#/admin/projects/[project-id]) и временно измените значение «Require Change-Id in commit message» на False.

Не забудьте впоследствии изменить его обратно на Inherit или True!

person Ivan Vučica    schedule 13.07.2015

Проверьте свой репозиторий git перед фиксацией

gitrepo/.git/hooks/commit-msg

если этот файл отсутствует в этом месте, вы получите эту ошибку «отсутствует Change-Id в сообщении фиксации».

Чтобы решить эту проблему, просто скопируйте и вставьте хук коммита в папку .git.

person Mahi    schedule 22.07.2015

Вам необходимо выполнить следующие 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 = ".git". Вам необходимо обновить имя пользователя и ссылку Gerrit.

person Kashan    schedule 30.04.2018

1) gitdir=$(git rev-parse --git-dir);

2) scp -p -P 29418 <username>@gerrit.xyz.se:hooks/commit-msg ${gitdir}/hooks/

а) я не знаю, как выполнить шаг 1 в Windows, поэтому пропустил его и использовал жестко заданный путь в step 2 scp -p -P 29418 <username>@gerrit.xyz.se:hooks/commit-msg .git/hooks/

б) Если вы получите сообщение об ошибке ниже, вручную создайте каталог «hooks» в папке .git.

protocol error: expected control record

c) если у вас есть подмодуль, скажем, «XX», вам также нужно повторить шаг 2 и на этот раз заменить ${gitdir} на этот путь к подмодулям

d) Если scp не распознается Windows, укажите полный путь к scp.

"C:\Program Files\Git\usr\bin\scp.exe"

e) папка .git присутствует в репозитории вашего проекта и является скрытой папкой.

person Ravi Yadav    schedule 09.08.2018

в моей папке .git/hooks отсутствовали некоторые образцы файлов. например, commit-msg, post-commit.sample, post-update.sample... добавление этих файлов решило мою проблему отсутствия идентификатора изменения.

person schin chan    schedule 29.10.2018

Я тоже получил это сообщение об ошибке.

и что заставляет меня думать, что здесь полезно дать ответ, так это то, что ответ от @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
person kagb    schedule 04.12.2013

Сегодня утром мы решили эту проблему, повторно клонировав репозиторий и повторно применив изменения. Это самый простой способ повторно синхронизировать вашу локальную копию с Gerrit. Как всегда, сначала мы создали резервную копию.

Хотя существует ряд других чрезвычайно сложных решений, часто бывает выгодно использовать простой подход, чтобы не усугубить ситуацию.

person Brad Hein    schedule 09.09.2014

Это также может произойти, если у вас есть это ограничение:

Пожалуйста, введите сообщение фиксации для ваших изменений. Строки, начинающиеся с «#», будут игнорироваться, а пустое сообщение прерывает фиксацию.

и вы делаете как я: напишите сообщение коммита, начинающееся с "#" .....

У меня была такая же ошибка, но у меня уже была commit-msg и я сделал rebase и все такое. Очень глупая ошибка :D

person ladybug23    schedule 27.02.2016
comment
В вопросе не упоминается это сообщение об ошибке, этот ответ на самом деле не отвечает на вопрос. - person DaveyDaveDave; 04.06.2018