551

Git 2.10リリース ノートのpretty属性に関するいくつかの記事を参照しました。gitを2.10.0にアップグレードし、グローバルに変更を加えた結果、次のようになりました-.gitconfig

[filter "lfs"]
    clean = git-lfs clean %f
    smudge = git-lfs smudge %f
    required = true
[user]
    name = xyz
    email = abc.def@gmail.com
    signingkey = AAAAAAA
[core]
    excludesfile = /Users/xyz/.gitignore_global
    editor = 'subl' --wait
[difftool "sourcetree"]
    cmd = opendiff \"$LOCAL\" \"$REMOTE\"
    path = 
[mergetool "sourcetree"]
    cmd = /Applications/SourceTree.app/Contents/Resources/opendiff-w.sh \"$LOCAL\" \"$REMOTE\" -ancestor \"$BASE\" -merge \"$MERGED\"
    trustExitCode = true
[alias]
    lg = log --graph --pretty=format:'%Cred%h%Creset -%C(yellow)%d%Creset %s %Cgreen(%cr) %C(bold blue)<%an>%Creset' --abbrev-commit --date=relative
[color "diff"]
    old = red strike
    new = green italic

しかし今、私は自分のコミットに署名しようとしています

git commit -a -S -m "message"

次のエラーが表示されます-

の秘密鍵のロックを解除するには、パスフレーズが必要です

ユーザー: 「XYZ (デジタル署名済み)」

2048 ビット RSA キー、ID AAAAAAAA、作成日 2016 年 7 月 1 日

エラー: gpg はデータに署名できませんでした 致命的: コミット オブジェクトの書き込みに失敗しました

- を使用して変更をコミットできますgit commit -a -m "message"

同じことを克服する方法はありますか?またはgpg、git のアップグレードに対応するために構成に必要な変更はありますか?


更新 1

Is there a way to "autosign" commits in Git with a GPG key?に従って、さらなる有用性も求めています。. を使用してすでにキーを構成しました

git config --global user.signingkey ED5CDE14(with my key) 
git config --global commit.gpgsign true

とにかく明らかに同じエラーが発生します。

4

44 に答える 44

11

2016 年 10 月の更新: issue 871に「Git 2.9.3 で署名が機能しなくなった」と記載されていました

2 日前 (2016 年 10 月 4 日) にリリースされた Git for Windows 2.10.1 では、コミットとタグの対話型 GPG 署名が修正されました。

最近の git の gpg-sign の変更 (Linux では問題ありません) により、Windows で非 MSYS2-git が MSYS2-gpg と対話する方法に問題が発生しています。


元の答え:

「 7.4 Git Tools - Signing Your Work 」を読んで、「 user.signingkey」構成が設定されていると仮定します。

gpg に関する最後の大規模なリファクタリング (Git 2.10 より前) はコミット 2f47eae2aにあり、エラー メッセージは次の場所に移動されました。gpg-interface.c

そのファイルにログを記録すると、コミット af2b21e (Git 2.10)の最近の変更が明らかになります。

gpg2 はすでに既定で長い形式を使用していますが、ほとんどのディストリビューションでは、互換性の理由から、古い 1.x バージョンの "gpg" がまだ使用されているようです。また、古いバージョンの gpg は 32 ビットの短い ID しか表示しないため、非常に安全ではありません。

これは実際には検証自体には関係ありません。検証に合格した場合、pgp 署名は良好です。
しかし、実際にはまだキーを持っていないので取得したい場合、または検証に使用されたキーを正確に確認して確認したい場合は、キーをより正確に指定する必要があります。

したがって、user.signingkey構成をどのように指定したか、および使用している gpg のバージョン (gpg1 または gpg2) を確認して、それらがエラー メッセージに影響を与えるかどうかを確認してください。

エラーメッセージの条件を変更するcommit 0581b54もあります ( commit 0d2b664を補完するものです):gpg failed to sign the data

現在、stderr からはまったく読み取っていません。ただし、将来のパッチで必要になるため、これで準備が整います (その場合、gpgすべての入力を読み取る前に書き込みますが、キー uid がパイプ バッファーをいっぱいにする可能性は低いです)。

コミット 4322353は、gpg が一時ファイルを使用するようになったことを示しているため、その周りに適切な問題がある可能性があります。

困難なケースを処理する tempfile オブジェクトを使用するように変換し、欠落しているクリーンアップ呼び出しを追加しましょう。

于 2016-09-19T07:57:23.113 に答える
10

cygwin を使用して、最近 に切り替えましたgpg2。次に、設定後にgitで署名するのと同じ問題がありましたgit config gpg.program gpg2

gpg2echo "test" | gpg2 --clearsignが動作しているかどうかを確認してください。を設定するのが最も簡単な解決策であることがわかりましたgit config gpg.program gpg。しかし、この方法では、pinentry をインストールする必要があるなど、より良いエラーも発生します。

于 2017-11-07T09:47:12.513 に答える
5

私は同じ問題に遭遇しました。git 2.10.0問題がではなく にあることを報告させていただきますgnupg 1.4.21

gnupg を一時的に 1.4.20 にダウングレードすると、問題が解決しました。

自作を使用していて、私のようにパッケージをアップグレードした場合は、実行brew switch gnupg 1.4.20して元に戻すことができます。

于 2016-09-21T20:43:48.710 に答える
1

簡単にセットアップできました:

brew uninstall gpg 

brew install gpg2
于 2018-05-23T11:12:28.883 に答える
1

私にとって、これを修正するために私がしなければならなかったのは、またはそれbrewを更新したことだけです。gnupggpg

brew link --overwrite gnupg

gpg私が確認できるように、それは正しい場所にリンクし、which gpgその後すべてが機能しました。

于 2020-08-27T08:09:39.250 に答える
-1

以下のコマンドを使用して gpg が有効になっているかどうかを確認します

git config -l | grep gpg

true が返された場合は、以下のコマンドを実行して無効にします

git config --global --unset commit.gpgsign

上記のコマンドが正常に実行された後、git commit コマンドを実行できるはずです。

于 2018-06-20T06:46:49.073 に答える