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

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

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

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

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

Вопросы

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

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

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

4 ответа

Решение

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

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

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

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

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

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

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

Список рассылки + 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}

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

@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:

Автор — это человек, который первоначально написал произведение, тогда как коммиттер — это человек, который последним применил произведение.

Важно понимать, что нельзя доверять правильности названий. Возможно, более (досадно) педантичное определение могло бы звучать так:

Автором является лицо, которое (предположительно) первоначально написало произведение, тогда как коммиттером является лицо, которое (предположительно) последним применило произведение.

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

Другие вопросы по тегам