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

Я пытаюсь сделать фиксацию как

git commit --author="John Doe <[email protected]>" -m "<the usual commit message>"

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

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

Вопросы

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

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

  • Если да, то как?

Ответ 1

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

В чем разница между двумя (Committer vs author)?

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

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

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

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

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

Ответ 2

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

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

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

  • автор, который написал патч
  • Коммиттер - это кто-то, кто поддерживает проект, и который объединил патч

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

Git веб-интерфейсы, такие как GitHub и GitLab, могут генерировать или не генерировать автора!= committer

Так как Git (Hub | Lab) удерживает как верхний, так и репозиторий 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.

  • rebase сверху master

    GitHub также взламывает коммиты, чтобы установить коммиттер ==, кто нажал кнопку слияния. Это необязательно, и даже не выполняется по умолчанию локально 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.