Разница между автором и коммитером в 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 поверх
masterGitHub также взламывает коммиты, чтобы установить 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.