Разница между автором и коммитером в Git?
Я пытаюсь сделать коммит, как
git commit --author="John Doe <john@doe.com>" -m "<the usual commit message>"
где Джон Доу-это какой-то пользователь, от имени которого я хочу сделать коммит.
кажется, все в порядке в git log
. Однако, когда я делаю gitk
,имя автора правильное, но имя коммиттера выбрано из моих глобальных настроек конфигурации git (и таким образом на мое имя/адрес электронной почты).
вопросы
в чем разница между ними (коммиттер vs авт.)?
должен ли я устанавливать фиксатор также и для другого пользователя?
Если да, то как?
2 ответа:
оригинальный плакат спрашивает:
в чем разница между ними (коммиттер против автора)?
автор-это человек, который изначально написал код. С другой стороны, коммиттером считается лицо, совершившее код от имени первоначального автора. Это важно в Git, потому что Git позволяет переписывать историю или применять исправления от имени другого человека. Элемент свободный онлайн Pro ГИТ книги объясняет это так:
вам может быть интересно, в чем разница между автор и коммиттер. Элемент автор - это человек, который изначально написал патч, в то время как коммиттер это человек, который в последний раз применял патч. Итак, если вы отправляете патч в проект, и один из основных участников применяет патч, вы оба получаете кредит - вы как автор и основной участник как коммиттер.
оригинальный плакат спрашивает:
должен ли я устанавливать фиксатор также и для другого пользователя?
нет, если вы хотите быть честным, вы не должны устанавливать коммиттера на автора, если только автор и коммиттер действительно не являются одним и тем же лицом.
рассылки +
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, могут генерировать или не генерировать автора != коммиттер
поскольку Git (Hub|Lab) содержит как восходящие, так и вилочные репозитории на одной машине, они могут автоматически делать все, что вы можно сделать локально, а также, в том числе любой из:
создать фиксацию.
не создает автор != коммиттер.
сохраняет SHA или новый коммит нетронутыми и создает новый коммит:
* Merge commit (committer == author == project maintainer) |\ | * Feature commit (committer == author == contributor) |/ * Old master (random committer and author)
исторически это был первый доступный метод на GitHub.
локально, это делается с помощью
git merge --no-ff
.это производит два коммита на запрос pull и сохраняет вилку в git история.
rebase поверх
master
GitHub также взламывает коммиты, чтобы установить committer == тот, кто нажал кнопку слияния. Это не обязательно, и даже не делается по умолчанию локально с помощью
git rebase
, но это дает подотчетность сопровождающему проекта.дерево git теперь выглядит так:
* 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' для отображения 'commit date'
перейти на низкий уровень и показать все данные фиксации:
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?
в основном, фиксация представляет собой текстовый файл, и он содержит два поля, разделенные строкой:
author {author_name} <{author_email}> {author_date_seconds} {author_date_timezone} committer {committer_name} <{committer_email}> {committer_date_seconds} {committer_date_timezone}
это дает понять, что оба являются двумя полностью независимыми записями данных в объекте фиксации.