私は 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 = [email protected]
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-07-01
エラー:gpgは致命的なデータの署名に失敗しました:コミットオブジェクトの書き込みに失敗しました
注 - 私はまだgit commit -a -m "message"
を使って変更をコミットすることができます
同じことを克服する方法はありますか?それともgitのアップグレードに合わせてgpg
設定に何らかの変更が必要ですか?
アップデート1
に従って、さらに有用性を追求するGitでGPGキーを使ってコミットを「自動署名」する方法はありますか。 。キーを使用してすでに設定しました
git config --global user.signingkey ED5CDE14(with my key)
git config --global commit.gpgsign true
とにかく明らかに同じエラーになります。
私はOSXでこの問題に遭遇しました。
Gpgの更新(brew)がgpg
の場所からgpg1
に変更されたようです。gitがgpgを検索する場所のバイナリを変更できます。
git config --global gpg.program gpg1
あなたがgpg1を持っていないなら:brew install gpg1
。
Gpg1は使用されなくなったようです/ "やさしく使われていない" したがって、おそらく実際にはgpg2にアップデートする必要があります。
brew upgrade gnupg # This has a make step which takes a while
brew link --overwrite gnupg
brew install pinentry-mac
echo "pinentry-program /usr/local/bin/pinentry-mac" >> ~/.gnupg/gpg-agent.conf
killall gpg-agent
最初の部分はgpg2をインストールし、後者は それを使うために必要なハック です。トラブルシューティングのために、 この答え を見てください(それはLinuxについてのものではありません)。それは良いテストを示唆しています:
echo "test" | gpg --clearsign # on linux it's gpg2 but brew stays as gpg
このテストが成功した場合(エラー/出力にPGP署名が含まれていない場合)、最新のgpgバージョンに正常に更新されました。
これでgit signingを再び使えるようになるはずです。
注意が必要です。
git config --global gpg.program gpg # perhaps you had this already? On linux maybe gpg2
git config --global commit.gpgsign true # if you want to sign every commit
注:署名付きコミットを実行した後は、次のコマンドで署名されたことを確認できます。
git log --show-signature -1
これは最後のコミットのgpg情報を含みます。
Gnupg2とgpg-agent 2.xを使用している場合は、必ず環境変数GPG_TTY
を設定してください。
export GPG_TTY=$(tty)
すべてが失敗した場合は、GIT_TRACE=1
を使用して、gitが実際に何をしているのかを確認してください。
$ GIT_TRACE=1 git commit -m "Add page that always requires a logged-in user"
20:52:58.902766 git.c:328 trace: built-in: git 'commit' '-vvv' '-m' 'Add page that always requires a logged-in user'
20:52:58.918467 run-command.c:626 trace: run_command: 'gpg' '--status-fd=2' '-bsau' '23810377252EF4C2'
error: gpg failed to sign the data
fatal: failed to write commit object
失敗したコマンドを手動で実行します。
$ gpg -bsau 23810377252EF4C2
gpg: skipped "23810377252EF4C2": Unusable secret key
gpg: signing failed: Unusable secret key
結局のところ、私の鍵は期限切れになっていた、gitは非難することではなかった。
私は DONE これを通して short そして easy recipe:
自動署名はMacOSでコミットします(グローバルにそして異なるIDEと)。
brew install gnupg gnupg2 pinentry-mac
git config --global user.signingkey <YOUR_SIGNING_KEY>
git config --global commit.gpgsign true
git config --global gpg.program gpg
以下をgpg.conf
ファイルに入れます(nano ~/.gnupg/gpg.conf
コマンドでファイルを編集します)。
no-tty
以下をgpg-agent.conf
ファイルに入れます(nano ~/.gnupg/gpg-agent.conf
コマンドでファイルを編集します)。
pinentry-program /usr/local/bin/pinentry-mac
古いデータで動かなくなるかもしれないプロセスgpg-agent
を殺すのを助けるかもしれません。そのため、新しいgpg-agent
がパスワードを要求します。
ここに私の2セント:
キーを作成してgpg-agentに追加するとき、passphrase
という名前を定義します。ある時点でpassphrase
が期限切れになり、gpg
を再度入力してキーのロックを解除し、再度署名を開始できるようにする必要があります。
gpg
とインターフェイスする他のプログラムを使用する場合、gpg
のパスフレーズの入力を求めるプロンプトはnot表示されます(基本的にgpg-agent
デーモン化されている場合、stdin
)に入力ダイアログを表示できない可能性があります。
解決策の1つはgpg --sign a_file.txt
で、キーを作成したときに入力したパスフレーズを入力すると、すべてが正常になります(gpg-agent
は自動的に署名する必要があります)
パスフレーズのタイムアウトをより長く設定し、常にこれを行う必要がないようにする方法については、 この回答 を参照してください。
または、ssh-keygen -p
でパスフレーズを完全に削除できます
2016年10月更新: 問題871 「署名がGit 2.9.3で機能しなくなった」との記載があった
Git for Windows 2.10.1 2日前にリリースされた(2016年10月4日)は、Interactive GPGのコミットとタグの署名を修正しました。
最近のgitでのgpg-signの変更(これはLinuxでは問題ありません)は、WindowsではMSYS2-git以外がMSYS2-gpgとやり取りする方法で問題を露呈します。
元の答え:
" 7.4 Gitツール - あなたの仕事への署名 "を読んで、あなたはあなたの " user.signingkey
"設定セットを持っていると思います。
Gpgに関する最後の大きなリファクタリング(Git 2.10以前)は commit 2f47eae2a にありました。ここで、エラーメッセージは gpg-interface.c
に移動されました。
そのファイルのログは commit af2b21e の最近の変更を明らかにします。(Git 2.10)
gpg2はすでにデフォルトでロングフォーマットを使用していますが、ほとんどのディストリビューションでは互換性の理由から依然として "gpg"が古い1.xバージョンであるようです。そして古いバージョンのgpgは32ビットの短いIDしか表示しません。これは非常に安全ではありません。
これは実際には重要ではありません verification それ自体:検証に合格した場合、pgp署名は良好です。
しかし、実際にキーをまだ持っておらず、それを取得したい場合、またはどのキーが検証に使用されたかを正確に確認したい場合は、より正確にキーを指定する必要があります。
そのため、user.signingkey
の設定、および使用しているgpgのバージョン(gpg1またはgpg2)がどのように指定されているかを確認して、エラーメッセージに影響があるかどうかを確認してください。
commit 0581b54 もあります( commit 0d2b664 を補足するために)gpg failed to sign the data
エラーメッセージの条件を変更します:
私達は現在stderrから全く読んでいません。しかし、将来のパッチではそうしたいので、これもそこに私たちを準備します(そしてその場合gpg はすべての入力を読む前に 書き込みを行います。パイプバッファーを作成します。
コミット4322353 これでgpgは一時ファイルを使うようになったので、それに関する正しい問題があるかもしれません。
一時的な問題を処理するtempfileオブジェクトを使用するように変換し、不足しているクリーンアップ呼び出しを追加しましょう。
Cygwinを使って、私は最近gpg2
に切り替えました。それから私はgit config gpg.program gpg2
を設定した後にgitで署名するのと同じ問題を抱えていました。
Gpg2が機能しているかどうかを確認するためにecho "test" | gpg2 --clearsign
を試してください。 git config gpg.program gpg
を設定するのが最も簡単な解決策だと思いました。しかし、この方法でもより良いエラーが発生します。あなたが松果をインストールする必要があること。
Gitのトレースは私の状況を非常に明らかにしていました...
GIT_TRACE=1 git commit -m "a commit message"
13:45:39.940081 git.c:344 trace: built-in: git commit -m 'a commit message'
13:45:39.977999 run-command.c:640 trace: run_command: gpg --status-fd=2 -bsau 'full name <[email protected]>'
error: gpg failed to sign the data
fatal: failed to write commit object
git
がチェックしていたフォーマットに従って初期キーを生成する必要がありました。上記の-bsau
に渡された値をそのままログにコピーし、以下で使用するのが最善です。
それで、
gpg --quick-generate-key "full name <[email protected]>"
それからそれは働いた。
それが役立つことを願っています。
MacOSマシンでこの問題に直面している人は、これを試してください。
brew uninstall gpg
brew install gpg2
brew install pinentry-mac
必要に応じて)gpg --full-generate-key
アルゴリズムを使用してキーを作成します。gpg --list-keys
を実行して、生成されたキーを取得してください。git config --global user.signingkey <Key from your list>
git config --global gpg.program /usr/local/bin/gpg
git config --global commit.gpgsign true
gpg --armor --export <key>
そしてGPGキーでこのキーをGitHubに追加してください: https://github.com/settings/keys (STARTとEND行を含みます)問題がまだ存在する場合:
test -r ~/.bash_profile && echo 'export GPG_TTY=$(tty)' >> ~/.bash_profile
echo 'export GPG_TTY=$(tty)' >> ~/.profile
問題がまだ存在する場合:
インストール https://gpgtools.org そしてメニューバーからSignを押してあなたが使用したキーに署名します:Key - > Sign
問題がまだ存在する場合:
あなたのグローバルな.gitconfig
ファイル(私の場合は:/Users/gent/.gitconfig
そして.gitconfigファイル_を修正してください(そしてEmailとNameが生成時に作成したものと同じであることを確認してください。キー):
[user]
email = [email protected]
name = Gent
signingkey = <YOURKEY>
[gpg]
program = /usr/local/bin/gpg
[commit]
gpsign = true
gpgsign = true
[filter "lfs"]
process = git-lfs filter-process
required = true
clean = git-lfs clean -- %f
smudge = git-lfs smudge -- %f
[credential]
helper = osxkeychain
私は同じ問題に遭遇しました。問題がgit 2.10.0
ではなくgnupg 1.4.21
にあることを報告できてうれしいです。
一時的にgnupgを1.4.20にダウングレードすると問題が解決しました。
自作を使用していて、私のようにパッケージをアップグレードした場合は、brew switch gnupg 1.4.20
を実行して元に戻すことができます。
私はgpgが動作するかどうかをテストしようとした後にこれを得たので、どういうわけか私は誤ってgpgを更新したに違いありません:
gpg: WARNING: server 'gpg-agent' is older than us (2.1.21 < 2.2.10)
gpg: Note: Outdated servers may lack important security fixes.
gpg: Note: Use the command "gpgconf --kill all" to restart them.
gpgconf --kill all
を実行することで私はそれを修正しました。
これが誰かに役立つことを願っています。
GPGキーのUIDに関連付けられたEメールがgitで使用しているEメールと異なる場合は、キーに別のユーザーIDを追加する必要がありますOR Eメールが完全に一致するキーを使用します。
以下を使用して別のUIDを追加できます。
$ gpg --edit-key
Mo https://superuser.com/questions/293184/one-gnupg-pgp-key-pair-two-emails を参照してください。
私はすべての依存関係(Zlib、Bzip、cURL、PCRE、ReadLine、IDN2、iConv、Unistringなど)の最新のソースと共に構築された最新のGitソース(2.12.2)についても同様の問題を抱えていました。
libreadline
がGnuPGの問題を引き起こしていたことがわかります。
$ gpg --version
gpg: symbol lookup error: /usr/local/lib/libreadline.so.7: undefined symbol: UP
そしてもちろん、-vvv
を使ってGitから有用な情報を得ようとしても失敗したので、失敗は謎でした。
ReadLineに起因するPGPの失敗を解決するには、 パッケージマネージャを更新または使用できない - gpg error の指示に従ってください。
ターミナルで:
ls /usr/local/lib
そこにはたくさんのreadlineライブラリ(libreadline.so.BLAH-BLAH)がありました。
su mkdir temp mv /usr/local/lib/libreadline* temp ldconfig
ぶら下がっているgpg-agentになるかもしれません。
ここで説明しているように、gpgconf --kill gpg-agent
を試してください
上記の答えは素晴らしいですが、それらは私にとってうまくいきませんでした。私の問題を解決したのは、 public と secret の両方のキーをエクスポートすることでした。
エクスポート元のマシンからのキーを一覧表示します。
$ gpg --list-keys
/home/user/.gnupg/pubring.gpg
--------------------------------
pub 1024D/ABCDFE01 2008-04-13
uid firstname lastname (description) <[email protected]>
sub 2048g/DEFABC01 2008-04-13
キーをエクスポートする
$ gpg --output mygpgkey_pub.gpg --armor --export ABCDFE01
$ gpg --output mygpgkey_sec.gpg --armor --export-secret-key ABCDFE01
インポート先のマシンに移動してインポートする
$ gpg --import ~/mygpgkey_pub.gpg
$ gpg --allow-secret-key-import --import ~/mygpgkey_sec.gpg
ビンゴボンゴ、完了です。
参照: https://www.debuntu.org/how-to-importexport-gpg-key-pair/
ps。私の鍵はもともとブートキャンプの窓7で作られたもので、私はそれらを私のMacにエクスポートしました(同じ物理マシン、事実上異なる)
あなたの電子メールが正しく設定されていることを確認してください。
git config --global user.email "[email protected]"
以下のURLに従って署名付きコミットを設定してください https://help.github.com/en/articles/telling-git-about-your-signing-key
それでもgpgを取得しても致命的なデータに署名できなかった場合:コミットオブジェクトを書き込めなかった
これはgitでは問題ありません、これはGPGで以下の手順に従ってください
1 .gpg --version
echo "test" | gpg --clearsign
表示されている場合:
gpg: signing failed: Inappropriate ioctl for device
gpg: [stdin]: clear-sign failed: Inappropriate ioctl for device
export GPG_TTY=$(tty)
を使います4.PGP署名が得られたecho "test" | gpg --clearsign
をもう一度試してください。
git config -l | grep gpg
gpg.program = gpg commit.gpgsign = true
6. git commit -S -m "commitMsz"
を適用する
上記の答えのどれも私の問題に合っていないようでした。私のgpg
name__バイナリ(/usr/local/bin/gpg -> /usr/local/MacGPG2/bin/gpg2
)は、brewではなく GPG Suite の一部としてインストールされました。
それにもかかわらず、私はその助言が次のようにまとめられたと感じました:「どちらのgpg
name__バイナリがbrewで入手可能な最新のバイナリを使用する」。だから私は試してみました:
brew update
brew upgrade git
brew install gpg
# the following are suggestions from brew's Caveats, to make `/usr/local/bin/gpg`
# point to the brew binary:
rm '/usr/local/bin/gpg'
brew link --overwrite gnupg2
$PATH
のgpg
name__をbrewの新しい実行可能ファイルを指すように正しく変更したことを確認しました。
???? which gpg
/usr/local/bin/gpg
???? ls -l /usr/local/bin/gpg
lrwxr-xr-x 1 burger admin 33 Feb 13 13:22 /usr/local/bin/gpg -> ../Cellar/gnupg2/2.0.30_3/bin/gpg
そして私はgitにどのgpg
name__バイナリを使うべきかを明示的に伝えました:
git config --global gpg.program gpg
まあ、それは道に敏感なので、それは完全に水密ではないかもしれません。私は実際にgitがgpg
name__を醸造することに切り替えたことを疑う余地なく確認することには至りませんでした。
いずれにせよ:git commit
が再び私のコミットに署名するのに十分なものではありませんでした。
私にとって最終的にうまくいったことは GPG Suiteを更新することです 。バージョン2016.7を実行していましたが、2016.10にアップデートすると問題が解決することがわかりました。
GPG Keychain.app
を開き、「Check for updates…」をクリックしました。新しいバージョンでは、署名されたコミットが再び正しく機能しました。
@birchlabsと非常によく似ていますが、たくさんの掘り下げて検索した結果、GPGではなくGPG Suiteであることがわかりました。私はcask reinstall gpg-suite
をしました、そしてそれは私のためにそれを解決しました。
それは単にそれによってセットアップを得ました:
brew uninstall gpg
brew install gpg2
ちょっと変なものですが、端末が十分に大きいことを確認してください! echo test | gpg --clearsign
を実行すると、サイズが小さすぎるかどうかを確認できます。これにより、わかりやすいエラーメッセージが表示されます。十分に大きくない場合、GPGエージェントはその小さなncursesボックスを表示できません。
GUIエージェントまたはncursesを使用しない何かを使用する場合、これは適用されません。
私はかなりの数の提案を試みたが運が悪い、そしてこれで終わった。私はこれが完璧ではないことを知っています、しかし私はできるだけ早く私の仕事に戻りたいです。
git config commit.gpgsign false
私の場合、他の回答で述べられている解決策はどれもうまくいきませんでした。私は問題が一つのリポジトリに固有のものであることを知りました。リポジトリを削除してクローンを作成すると、この問題は解決しました。
私の場合のように、これがランダムに起こって過去に完全に働いていたならば、ログアウト(cmd+shift+q
)してログインし直してみてください。
構成の問題ではなく、キーの有効期限が切れたため、このエラーに出くわしました。 OSXでその有効性を拡張する最も簡単な方法は、GPGキーチェーンアプリ(インストールされている場合)を開くことです。自動的に拡張を促すメッセージが表示されます。 2回クリックするだけで完了です。うまくいけば、これが仲間のGoogle社員に役立つ:)
私は同様の答えを見てきましたが、私のために働いたものとまったく同じものはありません。 Linuxでは、gpg-agent
を強制終了して再起動する必要がありました。
$ pkill gpg-agent
$ gpg-agent --daemon
$ git commit ...
これは私のためにトリックをしました。 user.signingkey
をプライベートキーに設定する必要があるようです。他のコメントからも同様です。