Разница между автором и коммитером в Git?
Я пытаюсь сделать фиксацию, как
git commit --author="John Doe <john@doe.com>" -m "<the usual commit message>"
где John Doe - это пользователь, от имени которого я хочу совершить фиксацию.
кажется, все в порядке в git log
. Однако, когда я делаю gitk
, имя автора правильное, но имя коммиттера выбрано из моих глобальных настроек конфигурации git (и таким образом на мое имя/адрес электронной почты).
вопросы
в чем разница между этими двумя (committer vs автор)?
должен ли я также устанавливать коммиттер для другого пользователя?
Если да, то как?
2 ответов
оригинальный плакат спрашивает:
в чем разница между ними (коммиттер против автора)?
автор-это человек, который изначально написал код. С другой стороны, коммиттер считается лицом, совершившим кодекс от имени первоначального автора. Это важно в Git, потому что Git позволяет переписывать историю или применять исправления от имени другого человека. The свободный онлайн Pro Git книги объясняет это так:
вам может быть интересно, в чем разница между автор и коммиттер. The автор является человеком, который первоначально написал патч, тогда как коммиттер - это человек, который последним применил патч. Итак, если вы отправляете патч в проект, и один из основных членов применяет патч, вы оба получаете кредит - вы как автор и основной член как коммиттер.
оригинальный плакат спрашивает:
должен ли я также устанавливать коммиттер для другого пользователя?
нет, если вы хотите быть честным, вы не должны устанавливать коммиттера на автора, если автор и коммиттер действительно не один и тот же человек.
рассылки + git format-patch
+ git apply
может генерировать автор != committer
в таких проектах, как ядро Linux, где патчи:
- создается с помощью
git format-patch
- отправлено по электронной почте, либо путем копирования вставки, или чаще всего с
git send-email
- применяется другим человеком с любым
git apply
илиgit am
: как использовать git am для применения патчей из электронной почты сообщения?
создание одного нового коммита с другим автором и коммиттером:
- автор, который написал патч
- коммиттер-это кто является сопровождающим проекта и кто объединил патч
см., например, этот случайно выбранный патч и соответствующий commit:
- 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
.это производит два коммита на запрос 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", чтобы показать "дату фиксации"
-
перейти на низкий уровень и показать все данные фиксации:
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}
это дает понять, что оба являются двумя полностью независимыми записями данных в объекте commit.