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


236

Я намагаюсь зробити таке, як зробити

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

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

Здається, все в порядку git log. Однак, коли я це роблю gitk, ім'я автора є правильним, але ім'я виконавця вибирається з моїх глобальних налаштувань git config (і таким чином встановлюється на моє ім’я / електронну пошту).

Запитання

  1. Яка різниця між двома (комітер проти автора)?

  2. Чи слід встановлювати комітер також іншому користувачеві?

  3. Якщо так, то як?




Комітер Git розміщується у файлі .gitconfig. Якщо ви --author таке, як ім'я .gitconfig, ви отримуєте лише автор у повідомленні про виконання. Якщо вони відрізняються, ви отримуєте і те, і інше.
poGUIst

Відповіді:


215

Оригінальний плакат запитує:

Яка різниця між ними (Комітер проти автора)?

Автор - людина, яка спочатку написала код. З іншого боку, комітетом вважається особа, яка вчинила код від імені оригінального автора. Це важливо в Git, оскільки Git дозволяє переписати історію або застосувати патчі від імені іншої людини. Безкоштовно онлайн Pro Git книга пояснює це наступним чином :

Ви можете бути здивовані , що різниця між автором і комміттером . Автор це людина , який спочатку написав патч, в той час як комміттер це людина , який останнім застосував патч. Отже, якщо ви надсилаєте патч до проекту, і один з основних членів застосовує патч, ви обидва отримуєте кредит - ви як автор, а основний член як комітет.

Оригінальний плакат запитує:

Чи слід встановлювати комітер також іншому користувачеві?

Ні, якщо ви хочете бути чесними, ви не повинні встановлювати покладеного на автора, якщо тільки автор і виконавець не є однаковою людиною.


1
Я все ще плутаюся з цього приводу. У мене це сталося, і в моєму випадку, наскільки мені відомо, жодного патчу чи переписування історії ніколи не відбувалося (якщо тільки деякі команди git не створюють та застосовують патчі, непрозоро, "під капотом"). Це справді єдині два способи, щоб щось подібне відбулося?
ковбасник

2
Також називати автора "людиною, яка написала код" не має сенсу. Як Git дізнався, хто це написав? Коли ви встановите git config userі тоді, git addі git commitтоді, git дізнається, хто додав і хто здійснив, але все одно не буде відомо, хто це написав.
ковбасник

1
@cowlinator Не знає, хто написав код. Ось чому ви повинні це сказати, якщо це не ви. Майте на увазі, що попередня розподілена система контролю версій до винайдення git надсилала ~~ Linus ~~ електронні листи технічного обслуговування з патчами для застосування. Ця функціональність існує, тому ~~ Linus ~~ обслуговуючий персонал може застосувати ваш патч, але все одно кредитує вас за нього "офіційним" способом, а не просто тимчасовим повідомленням у фіксації.
Фонд позову Моніки

92

Список розсилки + git format-patch+ git applyможе генерувати автора! = Виконавця

У таких проектах, як ядро ​​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.

  • відновити поверх 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}

Це дає зрозуміти, що обидва є двома повністю незалежними записами даних в об’єкті фіксації.


1
Зауважте, що навіть при GIT_COMMITTER_*переопрацюванні, git все одно відмовиться виконувати фіксацію, якщо ви не встановили компілятор за замовчуванням, використовуючи git config.
adelphus

1
@adelphus на Git 2.5, вона спрацює, якщо встановити обидваGIT_{COMMITTER,AUTHOR}_EMAIL
Ciro Santilli 郝海东 冠状 病 六四 事件 法轮功

3

@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виклику (зверніть увагу на подвійні дужки).

Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.