Разница между автором и коммиттером в Git?


237

Я пытаюсь сделать коммит как

git commit --author="John Doe <john@doe.com>" -m "<the usual commit message>"

где Джон Доу - пользователь, от имени которого я хочу сделать коммит.

Кажется, все в порядке git log. Однако, когда я делаю a gitk, имя автора является правильным, но имя коммиттера выбирается из моих глобальных настроек git config (и, таким образом, устанавливается на мое имя / адрес электронной почты).

Вопросы

  1. В чем разница между ними (коммиттер против автора)?

  2. Должен ли я настроить коммиттера также для другого пользователя?

  3. Если да, то как?




Git committer находится в файле .gitconfig. Если вы --author совпадает с именем .gitconfig, вы получаете только автора в сообщении коммита. Если они отличаются, вы получаете оба.
poGUIst

Ответы:


216

Оригинальный плакат спрашивает:

В чем разница между ними (коммиттер против автора)?

Автор - это человек, который изначально написал код. С другой стороны, коммиттером считается тот, кто передал код от имени первоначального автора. Это важно в Git, потому что Git позволяет вам переписывать историю или применять патчи от имени другого человека. Бесплатно онлайн Pro Git книга объясняет это следующим образом :

Вам может быть интересно, в чем разница между автором и коммиттером . Автор это человек , который первоначально написал патч, в то время как коммиттер это человек , который последним применил патч. Таким образом, если вы отправляете патч в проект, и один из основных участников применяет патч, вы оба получаете кредит - вы как автор и основной участник как коммиттер.

Оригинальный плакат спрашивает:

Должен ли я настроить коммиттера также для другого пользователя?

Нет, если вы хотите быть честным, вы не должны назначать коммиттера автору, если автор и коммиттер действительно не одно и то же лицо.


1
Я все еще смущен по этому поводу. У меня было такое, и в моем случае, насколько я знаю, не было никакого переписывания патча или истории (если только некоторые команды git не создают и не применяют патчи, непрозрачно, «под капотом»). Это действительно единственные 2 способа, чтобы это произошло?
cowlinator

2
Кроме того, называть автора «человеком, написавшим код», не имеет смысла. Откуда Гит знает, кто это написал? Когда вы устанавливаете, git config userа затем git addи git commit, тогда git будет знать, кто добавил, а кто совершил, но он все равно не будет знать, кто это написал.
Cowlinator

1
@cowlinator Не знаю, кто написал код. Вот почему вы должны сказать это, если это не вы. Имейте в виду, что предыдущая распределенная система контроля версий до того, как был изобретен git, отправляла ~~ Linus ~~ письма сопровождающего проекта с исправлениями, которые нужно применить. Эта функциональность есть, поэтому ~~ Linus ~~ сопровождающий может применить ваш патч, при этом по-прежнему зачисляя вас на него "официальным" способом, а не просто в специальном сообщении фиксации.
Фонд Моника судебный процесс

92

Список рассылки + git format-patch+ git applyможет сгенерировать автора! = Коммиттер

В таких проектах, как ядро ​​Linux, где исправления:

создание одного нового коммита с другим автором и коммиттером:

  • автор, который написал патч
  • коммиттер - это кто является сопровождающим проекта и кто слил патч

Посмотрите, например, этот случайно выбранный патч и соответствующий коммит:

Веб-интерфейсы 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}

Это проясняет, что оба являются двумя полностью независимыми записями данных в объекте фиксации.


1
Обратите внимание, что даже с GIT_COMMITTER_*переопределениями, git все равно откажется выполнять коммит, если вы не установили коммиттер по умолчанию, используя git config.
Адельфус

1
@adelphus на Git 2.5, он работает, если вы установите обаGIT_{COMMITTER,AUTHOR}_EMAIL
Ciro Santilli 法轮功 冠状 病 六四 事件 法轮功

3

@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вызова (обратите внимание на двойные скобки).

Используя наш сайт, вы подтверждаете, что прочитали и поняли нашу Политику в отношении файлов cookie и Политику конфиденциальности.
Licensed under cc by-sa 3.0 with attribution required.