git clone が公開鍵のエラーで失敗する場合の対処方法
以下は Debian 9 Stretch の amd64 版のはなし。
以前 github から clone する際に以下のような公開鍵のエラーが発生してclone に失敗することがあった。
gnutls_handshake() failed: Public key signature verification has failed.
その時はこちらのページを参考にして、
git の Debian パッケージが依存している libcurl4-gnutls-dev を libcurl4-openssl-dev に変更してパッケージをビルドして解決していた。
だが、パッケージを hold 設定するのを忘れていて、apt-get upgrade したらオリジナルの gnutls 版の git がインストールされてしまい、再び clone できなくなってしまった。(できる場合もあった)
再度手動でパッケージを作成するのは面倒だなぁと思っていたところ、 reddit でビルドスクリプトの紹介があったのでこれを使用して、再び openssl 版 git のパッケージを作成する。
https://www.reddit.com/r/linuxquestions/comments/6ttzio/problem_with_git_on_debian_91_strech/
https://gist.github.com/pescobar/6ae5634f92d75d23c36a
ビルドスクリプトのダウンロードと、openssl 版 git のビルド
$ wget https://gist.githubusercontent.com/pescobar/6ae5634f92d75d23c36a/raw/829004bf2a2893a2cbc34f6a7b39bfd8b997d4be/build-git.sh $ bash build-git.sh
ビルドしたパッケージのインストール(Ubuntu の場合はスクリプト内でインストールしてる)
$ cd soure-git $ sudo dpkg -i ./*.deb
いくつかのパッケージがインストールに失敗したが、使用する予定がないので完全に削除する。
$ sudo apt-get --purge remove git-mediawiki git-svn git-all
残りのパッケージを hold するにあたり、まずはパッケージリストを作成。
$ dpkg -l | grep git | grep 2.14.2 | awk '{printf $2 " "}' > git_hold.list $ cat git_hold.list git git-core git-cvs git-daemon-run git-dbgsym git-doc git-el git-email git-gui git-man gitk gitweb
root になり、パッケージリスト内のパッケージを hold する。
$ su # for i in $(cat ./git_hold.list); do echo $i hold | dpkg --set-selections ; done
hold されたはずのパッケージを確認する。これらのパッケージは今後 apt-get upgrade してもアップグレードされない。
# dpkg -l | grep git | grep 2.14.2 | awk '{print $2}' git git-core git-cvs git-daemon-run git-dbgsym git-doc git-el git-email git-gui git-man gitk gitweb
hold の確認はこっちが確実。先頭が hi なら hold 済み。(ii なら hold されていない)
$ dpkg -l | grep git | grep 2.14.2 | awk '{print $1 " " $2}' hi git hi git-core hi git-cvs hi git-daemon-run hi git-dbgsym hi git-doc hi git-el hi git-email hi git-gui hi git-man hi gitk hi gitweb
適当なリポジトリを clone できるかテストして完了。
$ git clone https://github.com/nkon/rust_blinky.git Cloning into 'rust_blinky'... remote: Counting objects: 226, done. remote: Total 226 (delta 0), reused 0 (delta 0), pack-reused 226 Receiving objects: 100% (226/226), 575.37 KiB | 554.00 KiB/s, done. Resolving deltas: 100% (93/93), done. $