Разница между автором и коммиттером в 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.