Как подписать git фиксируется в среде IDE, например IntelliJ?

Вопрос Как мне подписать git коммиты с помощью IDE, такой как IntelliJ в Windows?

Если вам интересно, прочитайте то, что я пробовал здесь:

Я следовал в основном за гидом Github. Я позаботился о том, чтобы не забыть перезапустить bash/IntelliJ после того, как вы изменили конфигурационные файлы.

  1. Создать новую пару ключей GPG
  2. Добавьте ключ GPG в мою учетную запись GitHub
  3. .gitconfig проверенное (от GitHub) электронное письмо с моим ключом GPG, где я убедился, что электронное письмо в моем .gitconfig такое же.
  4. Расскажите Git о моем ключе GPG
  5. Подпишите коммит с GPG и подтвердите, что он проверен на Github.
  6. На этой же странице я установил коммиты для подписи по умолчанию с помощью git config --global commit.gpgsign true (я использую git 2.12). Я сделал новый коммит и подтвердил, что он был подписан с помощью git verify-commit HEAD
  7. Когда я пытаюсь зафиксировать в IntelliJ, я получаю gpg: cannot open tty 'no tty' поэтому я обнаружил, что IntelliJ не может зафиксировать изменения при попытке подписать коммит (GPG), и добавил no-tty в мой C:\Users\username\.gnupg\gpg.conf файл и перезапустить.

  8. Затем я получаю сообщение об ошибке gpg: Sorry, no terminal at all requested - can't get input который кажется разумным, потому что я просто добавил опцию, которая имеет отношение к терминалу. Как и в gpg: Извините, терминал вообще не запрашивается - не могу получить данные, потому что решение состоит в том, чтобы удалить no-tty который, я надеюсь, не применим к моему делу.

  9. Другие ответы на первый вопрос также предлагали добавить use-agent в файл gpg.conf, что приводит к дополнительной ошибке gpg: gpg-agent is not available in this session. Ах, подождите, может быть, мне нужно настроить gpg-agent.

  10. Лучшее руководство для Windows, которое я смог найти, - это Archlinux wiki (да, верно). В нем указывается добавить в C: /Users/username/.gnupg/gpg-agent.conf время жизни, поэтому я создаю этот файл и добавляю default-cache-ttl 34560000 и max-cache-ttl 34560000 согласно https://superuser.com/info/624343/keep-gnupg-credentials-cached-for-entire-user-session

  11. Теперь позвольте мне запустить этот gpg-agent, https://superuser.com/info/1153101/why-does-git-complain-that-no-gpg-agent-is-running заставил меня проверить, что действительно gpg-agent --version был намного новее, чем gpg --version, поэтому я хотел бы иметь gpg2, чтобы я мог запустить git config --global gpg.program gpg2.

  12. Но у меня нет gpg2 в командной строке. Я установил Gpg4win (бинарные выпуски, внизу) и даже Gnupg 2 по отдельности, но это не дало мне gpg2 в командной строке, я заметил, что мне нужно было поместить папку GNU в мои Program Files (x86), что, как мне кажется, должно быть. С помощью where gpg я узнал, что он по крайней мере не указывает на gpg, который я только что скачал, потому что тот показал второе. Поэтому я указал git на нужный git config --global gpg.program 'C:\Program Files (x86)\GnuPG\bin\gpg.exe' с помощью git config --global gpg.program 'C:\Program Files (x86)\GnuPG\bin\gpg.exe'

  13. Теперь у меня есть ошибка gpg: skipped "keyid": secret key not available. Решение в gpg: пропущено "N": секретный ключ недоступен, это то, что я только что сделал, так что это не поможет. Тогда я понял, что все настроил с другим gpg, а не с этим. Я сделал alias gpg="'C:\Program Files (x86)\GnuPG\bin\gpg.exe'", проверил gpg --version и сделал все заново. На самом деле, я добавил строку псевдонима в свой .bash_profile поэтому мне не нужно запускать его каждый раз.

  14. Когда я пытаюсь gpg --gen-key он зависает немедленно. Понятия не имею, почему, я не думаю, что проблема заключается в недостаточной энтропии, потому что старый gpg работал нормально, но возможно, что более новая версия требует большей энтропии. В любом случае я не смог найти ни одного пользователя Windows с такой же проблемой в Интернете.

  15. Оно работает! Когда я фиксирую в IntelliJ, он запрашивает мою парольную фразу с пинентри только один раз. Но теперь я не могу сделать коммит из Git Bash с ошибкой no secret key которая имеет смысл, потому что, как я сказал, gpg --list-keys пуст: ни один ключ не связан с этим gpg.

  16. Подписание Intellij IDEA GIT фиксирует с GPG, имеет отношение, но единственный ответ для MAC и, кажется, не относится к Windows. Это привело меня к:

  17. me.m01.eu намекает на добавление новой переменной окружения GNUPGHOME которая указывает на C:\Users\username\.gnupg. Этот каталог существует, но, как уже упоминалось в ответе на запрос git commit, произошел сбой: секретный ключ недоступен. Я думаю, что мой новый gpg использует C:\Users\username\AppData\Roaming\gnupg поэтому я добавил его. Я проверил с помощью printenv GNUPGHOME что я добавил его правильно (мне пришлось перезагрузить компьютер). Ничего не изменилось, хотя.

  18. Поскольку мои ключи, я думаю, в C:\Users\username\.gnupg я попытался указать туда переменную окружения, но это не помогло, gpg --list-keys все еще был пуст. Поэтому мне пришлось искать другой способ указать gpg, где находятся мои ключи.

  19. gpg --list-keys --homedir='C: /Users/s156757/.gnupg' дал правильные ключи, поэтому я решил добавить homedir C:\Users\s156757\.gnupg в мой C:\Users\username\AppData\Roaming\gnupg\gpg.conf Файл C:\Users\username\AppData\Roaming\gnupg\gpg.conf который мне пришлось создать. Из-за этой ошибки. Я подтвердил, что gpg --list-keys вернул мои ключи. Все та же ошибка, добавление no-tty и use-agent к этому файлу conf не помогло.

Теперь я могу skipped "keyid": No secret key из IntelliJ, но не с помощью Git Bash, что приводит к skipped "keyid": No secret key.

Больше мыслей

  1. Мне не удалось экспортировать ключи из gpg в gpg2 с помощью gpg --export [ID] | gpg2 --import && gpg --export-secret-keys [ID] | gpg2 --import gpg --export [ID] | gpg2 --import && gpg --export-secret-keys [ID] | gpg2 --import
  2. Я думал, что только Gpg4win можно настроить, поэтому мне не нужно каждый раз вводить пароль. К сожалению, я нигде не смог найти способ заставить Gpg4win запомнить мою фразу-пароль.
  3. Позже я подумал, что если я правильно помню, gpg --list-secret-keys никогда не возвращал ничего для gpg 2. Я только позже узнал, что эта команда отличается от gpg --list-keys.

Короче говоря, это главная проблема: gpg-agent разрешает кэширование парольной фразы, но gpg-версия git не соответствует версии gpg-agent, поэтому сначала вам нужно установить правильный gpg 2. Но мне не удалось выполнить эту установку таким образом, чтобы я мог выполнять коммиты как из Git Bash, так и из IntelliJ.

Ответ 2

Начиная с git 2.19.1, gpg2 поддерживается!

gpg-agent теперь может обрабатывать автоматическую подпись, запоминая вашу фразу

Это должно упростить использование gpg для автоматической подписи коммитов. Чтобы быть точным, версия git 2.19.1 имеет по крайней мере gpg 2.2.9. Эти инструкции были протестированы в Windows 7, Windows 8.1, Windows 10, Arch Linux и Fedora 29.

Шаги по настройке подписи git commit

  1. Рекомендуется настроить ssh, см., Например, help.github.com/en/articles/connecting-to-github-with-Ssh (также когда вы не используете GitHub)
  2. Запустите (в Linux) терминал или (в Windows) git bash, проверьте с помощью git --version что git по крайней мере 2.19.1, и с gpg --version что вы используете gpg2.

    Если нет, проверьте с помощью where gpg (или which gpg если команда where недоступна), что самый верхний путь - это git.

    • Если вы не видите пути или нет пути с gpg2, попробуйте команду gpg2 вместо gpg, поэтому gpg2 --version. Если это gpg2 теперь вам придется использовать gpg2 вместо gpg.
    • Если вы видите путь git, но он не самый верхний, поместите (в Windows) alias gpg="'C:\path\to\Git\usr\bin\gpg.exe'" в вашем C:\Users\username\.bash_profile, создайте файл, если он не существует, и перезапустите git bash. Попробуйте снова where gpg и gpg --version. Теперь, когда gpg вводится в файл, вы должны заменить его на 'C:\path\to\Git\usr\bin\gpg.exe'.
  3. Проверьте в выводе gpg --version ли домашний каталог чем-то вроде (в Linux) /home/username/.gnupg или (в windows) /c/Users/username/.gnupg. Этот каталог еще не должен существовать.

    Если путь неверен, попробуйте изменить его - например, однажды в Windows я увидел, что в моем доме указан префикс пути, по которому я запускал команду, поэтому я поместил псевдоним в .bash_profile с alias gpg="gpg --homedir=/c/Users/s156757/.gnupg" и перезапустил bash, затем снова проверил.

  4. Следующие несколько шагов взяты из хорошего руководства по Github, желательно проверить, верны ли команды. Сначала сгенерируйте новую пару ключей GPG (но не устанавливайте инструменты gnupg!): Запустите gpg --full-generate-key
    • Выберите RSA и RSA и 4096 бит.
    • В качестве реального имени используйте ваше user.name как в вашем ~\.gitconfig.
    • В качестве электронной почты используйте электронную почту user.email в ~\.gitconfig, чтобы убедиться, что это электронное письмо является подтвержденным на GitHub.
    • Если вы хотите попробовать gpg-agent (вам придется вводить пароль хотя бы один раз после каждой перезагрузки) или если у вас все в порядке с непроверенным значком на GitHub, укажите пароль. В противном случае оставьте это пустым.
  5. Каждый раз, когда вы хотите проверить, какие ключи у вас есть, используйте gpg --list-Secret-keys --keyid-format LONG. Сделайте это сейчас, и скопируйте key_id (как я теперь буду называть ваш ключ) из выходных sec rsa4096/key_id 2018-10-27 [SC]...
  6. Распечатайте открытый ключ с помощью gpg --armor --export key_id.
  7. Добавьте ключ GPG в свою учетную запись GitHub: перейдите в Settings | SSH and GPG keys Settings | SSH and GPG keys и добавьте блок открытого ключа (включая верхний и нижний колонтитулы).
  8. Расскажите Git о своем ключе GPG: git config --global user.signingkey key_id.
  9. Если вам раньше приходилось использовать --homedir, вам нужно убедиться, что когда git запускает gpg, дом также будет правильно изменен. Создайте файл C:\Users\username\start-gpg.sh и поместите в него gpg --homedir=/c/Users/s156757/.gnupg "[email protected]". Затем запустите git config --global gpg.program C:\\Users\\username\\start-gpg.sh чтобы указать git использовать его.
  10. Перезапустите Bash.
  11. Подпишите коммит с помощью GPG с помощью git commit -S -m "signed commit" и подтвердите, что он проверен на Github, вы должны увидеть небольшой значок при просмотре вашего коммита.
  12. Установите коммиты для подписи по умолчанию с помощью git config --global commit.gpgsign true. Сделайте новый коммит и убедитесь, что он был подписан с помощью git verify-commit HEAD.

Действия по автоматическому подписанию коммита: три варианта

1. У меня нет пароля на моем ключе

Вы сделали

2. Хочу попробовать gpg-agent

Для меня этот вариант не сработал: мне все еще приходилось часто вводить парольную фразу, хотя и не всегда. Но в теории это работает:

  1. Обновите время кэширования в C:\Users\username\.gnupg\gpg-agent.conf: создайте файл, если он не существует, добавьте default-cache-ttl 34560000 и max-cache-ttl 34560000.
  2. Перезапустите gpg-agent с помощью gpgconf --kill gpg-agent
  3. Теперь вам нужно будет ввести вашу парольную фразу один раз при фиксации, а потом уже нет. Убедитесь, что ваш коммит Verified на GitHub.

3. Передайте фразу в текстовом виде в gpg.

Это означает, что вам никогда не придется предоставлять свою фразу-пароль, но для меня это означает, что GitHub помещает Unverified значок в мой коммит. Вопрос здесь: ключ, идентификатор ключа которого находится в подписи, не подписывал этот коммит

  1. Если вы уже создали его, замените все содержимое C:\Users\username\start-gpg.sh с кодом ниже. Если вы этого не сделали, создайте файл с содержимым ниже, удалите флаг --homedir и запустите git config --global gpg.program C:\\Users\\username\\start-gpg.sh. В любом случае перезапустите bash.

Да, вы собираетесь разместить свой пароль в виде открытого текста на вашем компьютере! Если вы знаете лучший способ, пожалуйста, оставьте комментарий...

# Passphrase-file-descriptor is set to 0 (STDIN), to use it --batch must be used
# The --pinentry-mode loopback is required since gpg 2.1.0 for --passphrase-fd
# The "[email protected]" makes sure that whatever git wanted gpg to do, is still done
echo mypassphrase | gpg --homedir=/c/Users/username/.gnupg --passphrase-fd 0 --batch --yes --pinentry-mode loopback "[email protected]"
  1. Зафиксируйте, нажмите и убедитесь, что вас не спрашивали о парольной фразе и что ваш коммит все еще Verified на GitHub.

Старый ответ для старых версий git без gpg2

Для справки, вот полные инструкции, или, вернее, шаги, которые я сделал, чтобы заставить его работать. Под "работой" я подразумеваю, что коммиты подписываются автоматически, но есть два недостатка:

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

  1. Первые несколько шагов взяты из хорошего руководства по Github: создайте новую пару ключей GPG
  2. Добавьте ключ GPG в свою учетную запись GitHub
  3. Свяжите проверенное (от GitHub) электронное письмо с вашим ключом GPG и убедитесь, что имя и адрес электронной почты в вашем .gitconfig совпадают.
  4. Расскажите Git о вашем ключе GPG
  5. Подпишите коммит с GPG и подтвердите, что он проверен на Github, вы должны увидеть маленький значок при просмотре своего коммита.
  6. Установите коммиты для подписи по умолчанию с помощью git config --global commit.gpgsign true. Сделайте новый коммит и убедитесь, что он был подписан с помощью git verify-commit HEAD.

  7. Версия gpg, поставляемая с git, слишком старая, поэтому установите Gpg4win (бинарные выпуски, внизу), который должен установить gpg 2. С помощью where gpg вы должны увидеть два пути, из которых, вероятно, второй - ваш новый gpg, что-то вроде C:\Program Files (x86)\GnuPG\bin\gpg.exe. Если нет, попробуйте установить Gnupg 2 отдельно со страницы загрузок.

  8. Я помещаю alias gpg="'C:\Program Files (x86)\GnuPG\bin\gpg.exe'" чтобы указать команду gpg на мой новый gpg в моем C:\Users\username\.bash_profile, перезапустить Git Bash и проверьте с помощью gpg --version что я сейчас использую gpg 2.

  9. Добавьте новую переменную среды с именем GNUPGHOME которая указывает на C:\Users\username\.gnupg. Перезагрузитесь и проверьте с помощью printenv GNUPGHOME что вы добавили его правильно.

  10. Сделайте скрипт C:\Users\username\gpg-no-tty.sh и вставьте в него echo passphrase | "C:\Program Files (x86)\GnuPG\bin\gpg.exe" --passphrase-fd 0 --batch --no-tty --yes "[email protected]" echo passphrase | "C:\Program Files (x86)\GnuPG\bin\gpg.exe" --passphrase-fd 0 --batch --no-tty --yes "[email protected]"

    Причина, по которой вы помещаете вашу парольную фразу в открытый текст, заключается в --batch, что опция --batch, которая заставляет все это работать, нуждается в --batch. Мне кажется, что должно существовать лучшее решение, чем сохранение вашей парольной фразы в виде открытого текста на вашем компьютере, поэтому, пожалуйста, оставьте комментарий, если вы нашли что-то лучшее.

  11. Укажите git на этот скрипт с помощью git config --global gpg.program C:\\Users\\username\\gpg-no-tty.sh.

  12. Теперь протестируйте в Git Bash и IntelliJ то, что вы можете зафиксировать, и убедитесь, что это работает, выполнив git verify-commit HEAD.