Чи є спосіб "автоматичного дизайну" здійснювати в Git ключем GPG?


213

Чи є простий спосіб змусити Git завжди підписувати кожен створений комірок або тег?

Я спробував це з чимось на кшталт:

псевдонім здійснювати = виконувати -S

Але це не зробило трюку.

Я не хочу встановлювати іншу програму, щоб це сталося. Це можна зробити з легкістю?

Лише побічне запитання, можливо, комітети не повинні підписуватися, а лише теги, які я ніколи не створюю, оскільки я надсилаю одиночні комісії для такого проекту, як Homebrew тощо.


8
Причина, по якій ваш псевдонім спрацював, полягає в тому, що ви не можете псевдоніму над командою, яка вже існує. (пов'язано: stackoverflow.com/questions/5875275/git-commit-v-by-default stackoverflow.com/questions/2500586/… stackoverflow.com/questions/1278296/… )
Dan D.

2
Просто для інформації: Перепишіть все коммітов для штовхання підписати їх: git filter-branch -f --commit-filter 'git commit-tree -S "$@"' HEAD@{u}..HEAD(я не маю в виду , ви повинні використовувати це).
Ві.

Відповіді:


275

Примітка: якщо ви не хочете додавати -Sвесь час, щоб переконатися, що ваші зобов’язання підписані, є пропозиція (відділення pu"на даний момент, грудень 2013 року, тому жодної гарантії, що вона зробить випуск git), додайте config, який подбає про цей варіант для вас.
Оновлення травня 2014 року: це в Git 2.0 (після повторної повторної роботи в цій серії патчів )

Дивіться команду 2af2ef3 від Ніколя Віг'є (boklm) :

Додати commit.gpgsignопцію для підписання всіх комісій

Якщо ви хочете, щоб GPG підписав усі свої зобов'язання, вам потрібно постійно додавати цю -Sопцію.
Опція commit.gpgsignconfig дозволяє підписувати всі зобов’язання автоматично.

commit.gpgsign

Логічне значення, щоб вказати, чи повинні усі комісії підписати GPG.
Використання цієї опції при виконанні таких операцій, як ребаза, може призвести до підписання великої кількості комісій. Може бути зручним користуватися агентом, щоб увімкнути кілька разів ваш пароль GPG.


Цей конфігурація, як правило, встановлюється за допомогою репо (не потрібно підписувати приватні експериментальні локальні репозиції):

cd /path/to/repo/needing/gpg/signature
git config commit.gpgsign true

Ви поєднали б це із user.signingKeyвикористовуваним як глобальним налаштуванням (унікальний ключ, який використовується для всіх репо, де ви хочете підписати комісію)

git config --global user.signingkey F2C7AB29

user.signingKeyбуло введено в git 1.5.0 (січень 2007) з комітом d67778e :

Не повинно бути вимоги, щоб я використовував ту саму форму свого імені в моєму сховищі git та в моєму gpg-ключі.
Далі я можу мати кілька ключів у своєму брелоку, і я можу захотіти використовувати той, який не співпадає з адресою, яку я використовую у повідомленнях про фіксацію.

Цей патч додає запис конфігурації " user.signingKey", який, якщо він присутній, буде переданий комутатору "-u" для gpg, що дозволить перекрити ключ підпису тегів.

Це застосовується за допомогою функції aba aba9119 (git 1.5.3.2) для того, щоб зафіксувати випадок, якщо користувач неправильно налаштував user.signingKeyу своїх .git/configабо просто не має секретних ключів на своєму ключі.

Примітки:


Це дійсно круто. Чи є простий спосіб на github зробити щось на кшталт git опису, не завантажуючи дію репо?

13
Вам не потрібно підписувати свої приватні експериментальні репортажі ... але чому б вам це не зробити?
Енді Хейден

168
git config --global user.signingKey 9E08524833CB3038FDE385C54C0AFCCFED5CDE14
git config --global commit.gpgSign true

Замініть 9E08524833CB3038FDE385C54C0AFCCFED5CDE14 своїм ідентифікатором ключа. Пам'ятайте: Ніколи не корисно використовувати короткий ідентифікатор .

ОНОВЛЕННЯ: Згідно з новим git edict , усі налаштування ключів повинні знаходитись у camelCase.


Ви просто скопіювали та вставили це з відповіді VonC ?
Роббі Аверілл

19
Ні. Як ви бачите в історії видання, хтось додав мій приклад у свою відповідь. ED5CDE14 - це мій особистий ключ. Але жодних проблем.
Феліпе

7
Химерність. Я поверну цю зміну завтра, оскільки це буде погано для вас
Роббі Аверилл

Як знайти свій ідентифікатор підпису ключа? Крім того, чи є лише 1 GPG-ключ для всіх моїх репостних подій погано? тому що я б вважав за краще не мати справу з 4 різними ключами у досить пов'язаних проектах.
MarcusJ

1
Це може допомогти користувачам Linux: Для того, щоб він працював у деяких випадках (наприклад, на Vim, використовуючи ключ, збережений на смарт-картці, який вимагає введення PIN-коду), мені довелося відредагувати ~/.gnupg/gpg-agent.confта додати pinentry-program /usr/bin/pinentry-gtk-2(дотримуючись цього посібника wiki.archlinux.org/ index.php / GnuPG # pinentry )
хочаvos гурульський

49

Edit: На Git версії 1.7.9, то це можна підписати Git яка вчиняє ( git commit -S). Трохи оновивши відповідь, щоб це відобразити.

Назва питання:

Чи є спосіб "автоматичного дизайну" здійснювати в Git ключем GPG?

Коротка відповідь: так, але не робіть цього.

Звернення до друкарської помилки у запитанні: git commit -sне підписує зобов’язання. Швидше зі man git-commitсторінки:

-s, --signoff
Додати підписаний рядок комітером у кінці повідомлення журналу фіксації.

Це дає вихід журналу, подібний до наступного:


± $ git log                                                                                 [0:43:31]
commit 155deeaef1896c63519320c7cbaf4691355143f5
Author: User Name 
Date:   Mon Apr 16 00:43:27 2012 +0200

    Added .gitignore

    Signed-off-by: User Name 

Зверніть увагу на біт "Підписано: ..."; що було породжене -sпрапором на git-commit.

Цитуючи повідомлення про випуск електронної пошти :

  • "git počin" дізнався "-S" до GPG - підписує комітет; це може бути показано за допомогою параметра "--show-signature" для "git log".

Так що так, ви можете підписати коміти. Однак я особисто закликаю бути обережними з цим варіантом; автоматичне підписання зобов’язань поруч безглуздо, див. нижче:

Лише побічне запитання, можливо, коміти не повинні підписуватися, а лише теги, які я ніколи не створюю, коли я надсилаю окремі коміти.

Це правильно. Комітети не підписані; теги є. Причину цього можна знайти в цьому повідомленні Лінуса Торвальда , останній абзац якого говорить:

Підписання кожного зобов’язання абсолютно нерозумно. Це просто означає, що ви автоматизуєте це, і ви робите підпис менше. Це також не додає жодної реальної цінності, оскільки для того, як робота GIT-ланцюга DAG роботи SHA1, вам завжди потрібен лише один підпис для того, щоб усі комісії, доступні для цього, були ефективно покриті цим. Тому підписання кожного зобов’язання просто не вистачає сенсу.

Я б закликав переглядати пов’язане повідомлення, яке пояснює, чому підписання фільмів автоматично не є гарною ідеєю набагато кращим способом, ніж я міг.

Однак якщо ви хочете автоматично підписати тег , ви зможете це зробити, загорнувши git-tag -[s|u]в псевдонім; якщо ви збираєтесь це зробити, ви, ймовірно, хочете встановити свій ідентифікатор ключа ~/.gitconfigабо .git/configфайл, що відповідає проекту . Більше інформації про цей процес можна знайти в книзі спільноти git . Підписання тегів нескінченно корисніше, ніж підписання кожного зобов’язання, яке ви приймаєте.


74
"Підписання кожного зобов'язання абсолютно дурне". -> Який кращий спосіб забезпечити виконання комісій, коли є розробник "щурів", який любить натискання комітетів з підробленим автором та виконавцем? Якщо є якась магія гака на сервері, він може направляти git blameкого хоче.
Ві.

11
0. стаття 1. "достатньо, щоб підписати їх усі" -> Як сказати "Я стверджую, що це справді моя різниця (але не впевнений у будь-яких попередніх та наступних зобов'язаннях). Я хочу поставити підпис на своїх зобов'язаннях не стверджуючи нічого про коміти, я витягнув з центрального сервера / що завгодно. 2. У ненадійному середовищі все ще має бути надійний інструмент для з'ясування того, хто винен. Якщо сервер перевіряє, чи всі підписи підписані ключем електронної пошти комітента, це важко підробити Комміт (якщо ви забезпечуєте ваш комп'ютер добре).
Vi.

9
Підписання одного комітету достатньо, якщо код ніколи не змінюється. Коли ви додасте більше комісій, вам знадобиться більше підписів. Підписання тегу позначає все СТАРІШЕ, ніж це введення. Якщо вам потрібна дрібнозерниста перевірка по мірі надходження комітетів, є сенс підписати кожну комісію. Інакше вам доведеться використовувати багато тегів, які просто захаращують репо. Під час автентифікованого віддаленого використання git repos ви повинні вводити свій пароль або ключ ssh кожен раз, коли ви натискаєте на зобов’язання, а не лише при натисканні тегів. Це схожа ситуація.
Ганс-Крістоф Штайнер

22
Я відчуваю, що Лінус якось пропускає суть. Він, схоже, має зовсім інший випадок використання підписаних зобов’язань, ніж ОП у цій темі. (Перевірка цілісності всього проекту, проти перевірки авторства одного
комітету

9
-1 за "Так, але не робіть цього". Відповідь має бути просто рівним "ТАК". Підписання комітетів доводить автору те, про що інакше можна збрехати в комітеті.
Урда

6

Щоб зробити автоматичне підписання перед git версією 2.0, вам доведеться додати псевдонім git для фіксації.

# git config --global alias.commit commit -S
[alias]
    commit = commit -S

0

Вам потрібно уточнити, що якщо ви підписуєте комісію або тег, це не означає, що ви затверджуєте всю історію. У разі здійснення зобов’язань ви підписуєте лише зміни, що знаходяться під рукою, а у випадку тегів - добре. Вам потрібно визначити, що ви маєте на увазі під цим. Можливо, ви потягнули за собою зміну, яка стверджує, що вона є у вас, але не була (тому що хтось інший натиснув її на ваш пульт). Або це зміна, в якій ви не хочете бути, але ви лише підписали тег.

У типових проектах OSS це може бути менш поширеним, але в корпоративному сценарії, коли ви раз у раз торкаєтесь коду, і не читаєте всієї історії, це може стати непоміченим.

Підписання зобов’язань є проблемою, якщо вони отримають переоцінку або вишню для інших батьків. Але було б добре, якби змінена фіксація могла вказувати на "оригінальний" комітет, який насправді підтверджує.


3
Звільнення - це як брехня. Використовувати його слід дуже ощадно. Інша справа, що вчинення підпису - це "підписання" коду, тому будьте впевнені, що це а) не анти-CYA і б) не витрачаються даремно.

11
@Barry "Звільнення - це як брехня. Її слід використовувати надзвичайно скупо »- це просто не так. Робочі процеси на основі бази даних так само справедливі, як і робочі процеси на основі злиття. Звільнення є надто потужним, щоб використовувати його мало.
Лукас Юріх

1
Якщо ви користуєтеся цим виключно з GitHub, це не є проблемою, ви не підписуєте об'єднання об'єднань, оскільки GitHub цього не підтримує. Перевага підписання будь-якого (не злиття) зобов’язання в цьому середовищі, це те, що це робить дуже очевидним, коли зловмисне зобов’язання було додано через PR, оскільки воно не буде підписане вашим ключем GPG.
Арран Кадбард-Белл

3
"Це небезпечно, якщо ви підписуєте комісію або тег (обидва підписуєте всю історію), що, можливо, ви вивели зміну, яка стверджує, що саме від вас" Якщо ви підписуєте лише зобов'язання, хоча я б не інтерпретував це як схвалення кожного зобов'язання, доступного від вашого. Ви не обов'язково заявляєте, що ці минулі зміни є вами дійсними або затвердженими, лише ви створили комісію на основі цих змін. (Хоча з тегом, я погоджуюся, що ви дійсно підписуєтесь на всі
комісії,

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