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

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

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

где John Doe - это пользователь, от имени которого я хочу совершить фиксацию.

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

вопросы

  1. в чем разница между этими двумя (committer vs автор)?

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

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

2 ответов


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

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

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

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

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

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

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


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

в таких проектах, как ядро Linux, где патчи:

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

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

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

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