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


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

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

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

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

вопросы

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

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

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

2 166

2 ответа:

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

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

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

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

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

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

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

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

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

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

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

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

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

поскольку Git (Hub|Lab) содержит как восходящие, так и вилочные репозитории на одной машине, они могут автоматически делать все, что вы можно сделать локально, а также, в том числе любой из:

  • создать фиксацию.

    не создает автор != коммиттер.

    сохраняет 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' для отображения 'commit date'

  • перейти на низкий уровень и показать все данные фиксации:

    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?

в основном, фиксация представляет собой текстовый файл, и он содержит два поля, разделенные строкой:

author {author_name} <{author_email}> {author_date_seconds} {author_date_timezone}
committer {committer_name} <{committer_email}> {committer_date_seconds} {committer_date_timezone}

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