Ответ 1
IDEA не является терминалом и в настоящее время не может обрабатывать подписи. См. Https://youtrack.jetbrains.com/issue/IDEA-127802.
Однако есть обходной путь, проверьте https://youtrack.jetbrains.com/issue/IDEA-127802#comment=27-1866498
Вопрос Как мне подписать git коммиты с помощью IDE, такой как IntelliJ в Windows?
Если вам интересно, прочитайте то, что я пробовал здесь:
Я следовал в основном за гидом Github. Я позаботился о том, чтобы не забыть перезапустить bash/IntelliJ после того, как вы изменили конфигурационные файлы.
.gitconfig
проверенное (от GitHub) электронное письмо с моим ключом GPG, где я убедился, что электронное письмо в моем .gitconfig
такое же.git config --global commit.gpgsign true
(я использую git 2.12). Я сделал новый коммит и подтвердил, что он был подписан с помощью git verify-commit HEAD
Когда я пытаюсь зафиксировать в IntelliJ, я получаю gpg: cannot open tty 'no tty'
поэтому я обнаружил, что IntelliJ не может зафиксировать изменения при попытке подписать коммит (GPG), и добавил no-tty
в мой C:\Users\username\.gnupg\gpg.conf
файл и перезапустить.
Затем я получаю сообщение об ошибке gpg: Sorry, no terminal at all requested - can't get input
который кажется разумным, потому что я просто добавил опцию, которая имеет отношение к терминалу. Как и в gpg: Извините, терминал вообще не запрашивается - не могу получить данные, потому что решение состоит в том, чтобы удалить no-tty
который, я надеюсь, не применим к моему делу.
Другие ответы на первый вопрос также предлагали добавить use-agent
в файл gpg.conf
, что приводит к дополнительной ошибке gpg: gpg-agent is not available in this session
. Ах, подождите, может быть, мне нужно настроить gpg-agent.
Лучшее руководство для 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
Теперь позвольте мне запустить этот 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
.
Но у меня нет 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'
Теперь у меня есть ошибка gpg: skipped "keyid": secret key not available
. Решение в gpg: пропущено "N": секретный ключ недоступен, это то, что я только что сделал, так что это не поможет. Тогда я понял, что все настроил с другим gpg, а не с этим. Я сделал alias gpg="'C:\Program Files (x86)\GnuPG\bin\gpg.exe'"
, проверил gpg --version
и сделал все заново. На самом деле, я добавил строку псевдонима в свой .bash_profile
поэтому мне не нужно запускать его каждый раз.
Когда я пытаюсь gpg --gen-key
он зависает немедленно. Понятия не имею, почему, я не думаю, что проблема заключается в недостаточной энтропии, потому что старый gpg работал нормально, но возможно, что более новая версия требует большей энтропии. В любом случае я не смог найти ни одного пользователя Windows с такой же проблемой в Интернете.
Оно работает! Когда я фиксирую в IntelliJ, он запрашивает мою парольную фразу с пинентри только один раз. Но теперь я не могу сделать коммит из Git Bash с ошибкой no secret key
которая имеет смысл, потому что, как я сказал, gpg --list-keys
пуст: ни один ключ не связан с этим gpg.
Подписание Intellij IDEA GIT фиксирует с GPG, имеет отношение, но единственный ответ для MAC и, кажется, не относится к Windows. Это привело меня к:
me.m01.eu намекает на добавление новой переменной окружения GNUPGHOME
которая указывает на C:\Users\username\.gnupg
. Этот каталог существует, но, как уже упоминалось в ответе на запрос git commit, произошел сбой: секретный ключ недоступен. Я думаю, что мой новый gpg использует C:\Users\username\AppData\Roaming\gnupg
поэтому я добавил его. Я проверил с помощью printenv GNUPGHOME
что я добавил его правильно (мне пришлось перезагрузить компьютер). Ничего не изменилось, хотя.
Поскольку мои ключи, я думаю, в C:\Users\username\.gnupg
я попытался указать туда переменную окружения, но это не помогло, gpg --list-keys
все еще был пуст. Поэтому мне пришлось искать другой способ указать gpg, где находятся мои ключи.
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
.
Больше мыслей
gpg --export [ID] | gpg2 --import && gpg --export-secret-keys [ID] | gpg2 --import
gpg --export [ID] | gpg2 --import && gpg --export-secret-keys [ID] | gpg2 --import
gpg --list-secret-keys
никогда не возвращал ничего для gpg 2. Я только позже узнал, что эта команда отличается от gpg --list-keys
.Короче говоря, это главная проблема: gpg-agent разрешает кэширование парольной фразы, но gpg-версия git не соответствует версии gpg-agent, поэтому сначала вам нужно установить правильный gpg 2. Но мне не удалось выполнить эту установку таким образом, чтобы я мог выполнять коммиты как из Git Bash, так и из IntelliJ.
IDEA не является терминалом и в настоящее время не может обрабатывать подписи. См. Https://youtrack.jetbrains.com/issue/IDEA-127802.
Однако есть обходной путь, проверьте https://youtrack.jetbrains.com/issue/IDEA-127802#comment=27-1866498
Это должно упростить использование gpg для автоматической подписи коммитов. Чтобы быть точным, версия git 2.19.1 имеет по крайней мере gpg 2.2.9. Эти инструкции были протестированы в Windows 7, Windows 8.1, Windows 10, Arch Linux и Fedora 29.
Шаги по настройке подписи git commit
Запустите (в Linux) терминал или (в Windows) git bash, проверьте с помощью git --version
что git по крайней мере 2.19.1, и с gpg --version
что вы используете gpg2.
Если нет, проверьте с помощью where gpg
(или which gpg
если команда where
недоступна), что самый верхний путь - это git.
gpg2
вместо gpg
, поэтому gpg2 --version
. Если это gpg2
теперь вам придется использовать gpg2
вместо gpg
.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'
. Проверьте в выводе gpg --version
ли домашний каталог чем-то вроде (в Linux) /home/username/.gnupg
или (в windows) /c/Users/username/.gnupg
. Этот каталог еще не должен существовать.
Если путь неверен, попробуйте изменить его - например, однажды в Windows я увидел, что в моем доме указан префикс пути, по которому я запускал команду, поэтому я поместил псевдоним в .bash_profile
с alias gpg="gpg --homedir=/c/Users/s156757/.gnupg"
и перезапустил bash, затем снова проверил.
gpg --full-generate-key
user.name
как в вашем ~\.gitconfig
.user.email
в ~\.gitconfig
, чтобы убедиться, что это электронное письмо является подтвержденным на GitHub.gpg --list-Secret-keys --keyid-format LONG
. Сделайте это сейчас, и скопируйте key_id
(как я теперь буду называть ваш ключ) из выходных sec rsa4096/key_id 2018-10-27 [SC]...
gpg --armor --export key_id
.Settings | SSH and GPG keys
Settings | SSH and GPG keys
и добавьте блок открытого ключа (включая верхний и нижний колонтитулы).git config --global user.signingkey key_id
.--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 использовать его.git commit -S -m "signed commit"
и подтвердите, что он проверен на Github, вы должны увидеть небольшой значок при просмотре вашего коммита.git config --global commit.gpgsign true
. Сделайте новый коммит и убедитесь, что он был подписан с помощью git verify-commit HEAD
.Вы сделали
Для меня этот вариант не сработал: мне все еще приходилось часто вводить парольную фразу, хотя и не всегда. Но в теории это работает:
C:\Users\username\.gnupg\gpg-agent.conf
: создайте файл, если он не существует, добавьте default-cache-ttl 34560000
и max-cache-ttl 34560000
.gpgconf --kill gpg-agent
Verified
на GitHub. Это означает, что вам никогда не придется предоставлять свою фразу-пароль, но для меня это означает, что GitHub помещает Unverified
значок в мой коммит. Вопрос здесь: ключ, идентификатор ключа которого находится в подписи, не подписывал этот коммит
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]"
Verified
на GitHub.Для справки, вот полные инструкции, или, вернее, шаги, которые я сделал, чтобы заставить его работать. Под "работой" я подразумеваю, что коммиты подписываются автоматически, но есть два недостатка:
unverified
: The key whose key-id is in the signature did not sign this commit. Someone may be trying to trick you.
The key whose key-id is in the signature did not sign this commit. Someone may be trying to trick you.
Следующий вопрос по этому вопросу - это ключ, идентификатор ключа которого находится в подписи, не подписавший этот коммитЕсли вы застряли, проверьте шаги в вопросе, чтобы увидеть, если у меня была такая же проблема.
.gitconfig
совпадают. Установите коммиты для подписи по умолчанию с помощью git config --global commit.gpgsign true
. Сделайте новый коммит и убедитесь, что он был подписан с помощью git verify-commit HEAD
.
Версия gpg, поставляемая с git, слишком старая, поэтому установите Gpg4win (бинарные выпуски, внизу), который должен установить gpg 2. С помощью where gpg
вы должны увидеть два пути, из которых, вероятно, второй - ваш новый gpg, что-то вроде C:\Program Files (x86)\GnuPG\bin\gpg.exe
. Если нет, попробуйте установить Gnupg 2 отдельно со страницы загрузок.
Я помещаю alias gpg="'C:\Program Files (x86)\GnuPG\bin\gpg.exe'"
чтобы указать команду gpg
на мой новый gpg в моем C:\Users\username\.bash_profile
, перезапустить Git Bash и проверьте с помощью gpg --version
что я сейчас использую gpg 2.
Добавьте новую переменную среды с именем GNUPGHOME
которая указывает на C:\Users\username\.gnupg
. Перезагрузитесь и проверьте с помощью printenv GNUPGHOME
что вы добавили его правильно.
Сделайте скрипт 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
. Мне кажется, что должно существовать лучшее решение, чем сохранение вашей парольной фразы в виде открытого текста на вашем компьютере, поэтому, пожалуйста, оставьте комментарий, если вы нашли что-то лучшее.
Укажите git на этот скрипт с помощью git config --global gpg.program C:\\Users\\username\\gpg-no-tty.sh
.
Теперь протестируйте в Git Bash и IntelliJ то, что вы можете зафиксировать, и убедитесь, что это работает, выполнив git verify-commit HEAD
.