Разница между автором и коммиттером в Git?
Я пытаюсь сделать коммит как
git commit --author="John Doe <john@doe.com>" -m "<the usual commit message>"
где Джон Доу - пользователь, от имени которого я хочу сделать коммит.
Кажется, все в порядке в git log
, Тем не менее, когда я делаю gitk
, имя автора правильное, но имя коммиттера выбрано из моих глобальных настроек git config (и, таким образом, установлено как мое имя / адрес электронной почты).
Вопросы
В чем разница между ними (коммиттер против автора)?
Должен ли я настроить коммиттера также для другого пользователя?
Если да, то как?
4 ответа
Оригинальный плакат спрашивает:
В чем разница между ними (коммиттер против автора)?
Автор - это человек, который изначально написал код. С другой стороны, коммиттером считается тот, кто передал код от имени первоначального автора. Это важно в Git, потому что Git позволяет вам переписывать историю или применять патчи от имени другого человека. БЕСПЛАТНАЯ онлайн книга Pro Git объясняет это так:
Вам может быть интересно, в чем разница между автором и коммиттером. Автор - это человек, который изначально написал патч, а коммиттер - это человек, который последним применил патч. Итак, если вы отправите патч в проект, и один из основных участников применит патч, вы оба получите кредит - вы как автор и основной участник как коммиттер.
Оригинальный плакат спрашивает:
Должен ли я настроить коммиттера также для другого пользователя?
Нет, если вы хотите быть честным, вы не должны назначать коммиттера автору, если автор и коммиттер действительно не одно и то же лицо.
Список рассылки + git format-patch
+ git apply
может сгенерировать автора!= коммиттер
В таких проектах, как ядро Linux, где исправления:
- создано
git format-patch
- отправлено по электронной почте, либо путем вставки копии, либо чаще с
git send-email
- применяется другим человеком с
git apply
или жеgit am
: Как использовать git am для применения патчей из сообщений электронной почты?
создание одного нового коммита с другим автором и коммиттером:
- автор, который написал патч
- коммиттер - это кто является сопровождающим проекта и кто слил патч
Посмотрите, например, этот случайно выбранный патч и соответствующий коммит:
- https://lkml.org/lkml/2018/1/25/568
- https://github.com/torvalds/linux/commit/5beda7d54eafece4c974cfa9fbb9f60fb18fd20a
Веб-интерфейсы Git, такие как GitHub и GitLab, могут создавать или не создавать автора!= Committer
Поскольку Git(Hub|Lab) хранит оба репозитория upstream и fork на одной машине, они могут автоматически делать все, что вы можете делать и локально, в том числе:
Создать коммит слияния.
Не генерирует автора!= Коммиттер.
Сохраняет SHA или новый коммит без изменений и создает новый коммит:
* Merge commit (committer == author == project maintainer) |\ | * Feature commit (committer == author == contributor) |/ * Old master (random committer and author)
Исторически это был первый доступный метод на GitHub.
На местном уровне это делается с
git merge --no-ff
,Это производит два коммита на запрос на извлечение и сохраняет ветвь в истории git.
перебазировать поверх
master
GitHub также взламывает коммиты, чтобы установить коммиттера == кто бы ни нажал кнопку слияния. Это не обязательно, и даже не делается по умолчанию локально
git rebase
, но это дает подотчетность сопровождающему проекта.Git tree теперь выглядит так:
* Feature commit (committer == maintainer, author == contributor) | * Old master (random committer and author)
что точно так же, как у
git apply
почтовые патчи.
На данный момент на GitHub:
- вы выбираете метод при слиянии через выпадающий на кнопку слияния
- методы могут быть включены или отключены в настройках репо владельцем
https://help.github.com/articles/about-merge-methods-on-github/
Как установить коммиттер нового коммита?
Лучшее, что я мог найти, это использовать переменные окружения для переопределения коммиттера:
GIT_COMMITTER_NAME='a' GIT_COMMITTER_EMAIL='a' git commit --author 'a <a>'
Как получить коммиттера и дату фиксации данного коммита?
Только авторские данные отображаются по умолчанию на git log
,
Чтобы увидеть дату коммиттера вы можете:
Отформатируйте журнал специально для этого:
git log --pretty='%cn %cd' -n1 HEAD
где
cn
а такжеcd
стоять заCommitter Name
а такжеCommitter Date
использовать
fuller
предопределенный формат:git log --format=fuller
Смотрите также: Как настроить 'git log' для отображения 'date commit'
перейти на низкий уровень и показать все данные фиксации:
git cat-file -p HEAD
Как установить дату принятия нового коммита?
git commit --date
только устанавливает дату автора: для даты коммиттера лучшее, что я мог найти, было с переменной окружения:
GIT_COMMITTER_DATE='2000-01-01T00:00:00+0000' git commit --date='2000-01-01T00:00:00+0000'
Смотрите также: В чем разница между автором и коммиттером в Git?
Как Git хранит автора против коммиттера внутри?
Смотрите: Каков формат файла объекта git commit?
По сути, фиксация - это текстовый файл, который содержит два поля, разделенных строками:
author {author_name} <{author_email}> {author_date_seconds} {author_date_timezone}
committer {committer_name} <{committer_email}> {committer_date_seconds} {committer_date_timezone}
Это проясняет, что оба являются двумя полностью независимыми записями данных в объекте фиксации.
@Ciro Santilli 新疆改造中心 六四事件 法轮功 предложил использовать
GIT_COMMITTER_NAME='a' GIT_COMMITTER_EMAIL='a' git commit --author 'a <a>'
Чтобы не повторять имя и адрес электронной почты, вы можете использовать их повторно.
GIT_COMMITTER_NAME='a'; GIT_COMMITTER_EMAIL='a'; git commit --author "$GIT_COMMITTER_NAME <$GIT_COMMITTER_EMAIL>"
который сначала устанавливает переменные в отдельных командах, а затем использует их для git commit
вызов (обратите внимание на двойные скобки).
Я думаю, стоит отметить, что использованные здесь определения имеют лишь предполагаемое значение. Например, из книги Pro Git:
Автор — это человек, который первоначально написал произведение, тогда как коммиттер — это человек, который последним применил произведение.
Важно понимать, что нельзя доверять правильности названий. Возможно, более (досадно) педантичное определение могло бы звучать так:
Автором является лицо, которое (предположительно) первоначально написало произведение, тогда как коммиттером является лицо, которое (предположительно) последним применило произведение.
В большинстве случаев нам не нужно верить в достоверность метаданных в коммите, но если вы хотите приблизиться к этой цели, вы можете использовать подписанные коммиты , что облегчает уверенность в том, что коммиттер — это человек, который подписал коммит.