Подписываем git коммиты

Решили у себя в команде, что будем подписывать коммиты и тэги. У git’а уже давно имеется данная возможность. Но мало кто ей пользуется. Благодаря этому возможны такие смешные поделки как git-blame-someone-else. Если же вы подписываете коммит своей подписью, то уверенности в том, что автор действительно вы, прибавляется.

Github в апреле прошлого года начал показывать зеленый бейджик когда коммит подписан. Вот как он выглядит:

Создать подпись и настроить git очень просто. Итак, давайте сделаем это:

1. Создаем подпись

Ставим gpg:

# Ubuntu
sudo apt-get install gpa seahorse
# Mac
brew install gpg

Создаем RSA пару (публичный и приватный ключ):

gpg --gen-key

(размер не ниже 2048, но и больше не особо нужно; срок годности по желанию)

Копируем полученный публичный ключ на Github:

gpg --list-secret-keys --keyid-format LONG

-------------------------------
sec   2048R/<COPY_LONG_KEY>  2017-01-14 [expires: 2019-01-14]
uid                          User Name <user.name@email.com>
ssb   2048R/098AA7C27DD57ACC 2017-01-14

gpg --armor --export <PASTE_LONG_KEY_HERE>

2. Настраиваем git

gpg --list-secret-keys

-------------------------------
sec   2048R/<COPY_SHORT_KEY> 2017-01-14 [expires: 2019-01-14]
uid                          User Name <user.name@email.com>
ssb   2048R/7DD57ACC         2017-01-14

git config --global user.signingKey <PASTE_SHORT_KEY_HERE>
git config --global commit.gpgsign true
git config --global tag.gpgsign true

(можно настроить индивидуально под каждый репозиторий).

3. Кэшируем пароль

чтобы не вводить его каждый раз при подписи.

Если вы пользователь Mac OS, то ставим GPG Suite, который интегрируется с Mac OS keychain. Переходим к шагу 4.

Если пользуетесь Linux, то придется воспользоваться встроенным gpg-agent.

Создаем конфиг .gnupg/gpg-agent.conf со следующим содержимым:

default-cache-ttl 28800
max-cache-ttl 28800

28800 - 8 часов (кто-то ставит 1 час).

В конфиге .gnupg/gpg.conf указываем:

use-agent
batch

batch убирает противные сообщения вида: You need a passphrase to unlock the secret key. Да, они по неведомой причине появляются даже, если агент закэшировал пароль.

Не забываем запустить gpg-agent:

fish:

if not begin
    # Is the agent running already? Does the agent-info file exist, and if so,
    # is there a process with the pid given in the file?
    [ -f ~/.gpg-agent-info ]
    and kill -0 (cut -d : -f 2 ~/.gpg-agent-info) ^/dev/null
end
    # no, it is not running. Start it!
    gpg-agent --daemon --no-grab --write-env-file ~/.gpg-agent-info >/dev/null ^&1
end
# get the agent info from the info file, and export it so GPG can see it.
set -gx GPG_AGENT_INFO (cut -c 16- ~/.gpg-agent-info)
set -gx GPG_TTY (tty)

или bash или напрямую gpg-agent --daemon.

4. Коммитим что угодно и идем смотреть результат на Github

Материалы:

Anton Kaliaev

Software engineer, blogger, public speaker, traveler

Ulyanovsk, Russia http://homeonrails.com