Git
Chapters ▾ 2nd Edition

7.4 Mga Git na Kasangkapan - Pag-sign sa Iyong Trabaho

Pag-sign sa Iyong Trabaho

Ang Git ay cryptographically na ligtas, ngunit hindi ito foolproof. Kung ikaw ay kumukuha ng trabaho mula sa iba sa internet at gusto mong mapatunayan na ang mga commit ay talagang mula sa isang pinagkakatuwalaan na pinagkukunan, ang Git ay may ilang mga paraan upang mag-sign at mapatunayan ang trabaho gamit ang GPG.

Ang Panimula sa GPG

Una sa lahat, kung gusto mong mag-sign ng anuman ang iyong kailangan upang makuha ang GPG na naka-configure at iyong personal na susi ay naka-install.

$ gpg --list-keys
/Users/schacon/.gnupg/pubring.gpg
---------------------------------
pub   2048R/0A46826A 2014-06-04
uid                  Scott Chacon (Git signing key) <schacon@gmail.com>
sub   2048R/874529A9 2014-06-04

Kung wala kang susi na naka-install, maaari kang bumuo ng isa gamit ang gpg --gen-key.

gpg --gen-key

Sa sandaling meron kang isang pribado na susi upang mag-sign, maaari kang mag-configure ng Git na gamitin ito para sa pag-sign ng mga bagay sa pamamagitan ng setting sa user.signingkey config na setting.

git config --global user.signingkey 0A46826A

Ngayon ang git ay gagamit ng iyong susi sa pamamagitan ng default upang i-sign ang mga tag at mga commit kung gusto mo.

Pag-sign ng mga Tag

Kung ikaw ay mayroong isang GPG na pribadong susi na setup, maaari mo nang gamitin ngayon ito sa pag-sign ng bagong mga tag. Ang dapat mong gawin ay gamitin ang -s sa halip na -a:

$ git tag -s v1.5 -m 'my signed 1.5 tag'

You need a passphrase to unlock the secret key for
user: "Ben Straub <ben@straub.cc>"
2048-bit RSA key, ID 800430EB, created 2014-05-04

Kung ikaw ay magpatakbo ng git show sa tag na iyon, maaari mong makita ang iyong GPG na pirma na nakalakip dito:

$ git show v1.5
tag v1.5
Tagger: Ben Straub <ben@straub.cc>
Date:   Sat May 3 20:29:41 2014 -0700

my signed 1.5 tag
-----BEGIN PGP SIGNATURE-----
Version: GnuPG v1

iQEcBAABAgAGBQJTZbQlAAoJEF0+sviABDDrZbQH/09PfE51KPVPlanr6q1v4/Ut
LQxfojUWiLQdg2ESJItkcuweYg+kc3HCyFejeDIBw9dpXt00rY26p05qrpnG+85b
hM1/PswpPLuBSr+oCIDj5GMC2r2iEKsfv2fJbNW8iWAXVLoWZRF8B0MfqX/YTMbm
ecorc4iXzQu7tupRihslbNkfvfciMnSDeSvzCpWAHl7h8Wj6hhqePmLm9lAYqnKp
8S5B/1SSQuEAjRZgI4IexpZoeKGVDptPHxLLS38fozsyi0QyDyzEgJxcJQVMXxVi
RUysgqjcpT8+iQM1PblGfHR4XAhuOqN5Fx06PSaFZhqvWFezJ28/CLyX5q+oIVk=
=EFTF
-----END PGP SIGNATURE-----

commit ca82a6dff817ec66f44342007202690a93763949
Author: Scott Chacon <schacon@gee-mail.com>
Date:   Mon Mar 17 21:52:11 2008 -0700

    changed the version number

Pag-verify na mga Tag

Para i-verify ang isang nakapirmang tag, gamitin mo ang git tag -v <tag-name>. Ang utos na ito ay gumagamit ng GPG upang i-verify ang pirma. Kailangan mo ng taga-sign na pampublikong susi sa iyong keyring para dito upang gumana ng maayos:

$ git tag -v v1.4.2.1
object 883653babd8ee7ea23e6a5c392bb739348b1eb61
type commit
tag v1.4.2.1
tagger Junio C Hamano <junkio@cox.net> 1158138501 -0700

GIT 1.4.2.1

Minor fixes since 1.4.2, including git-mv and git-http with alternates.
gpg: Signature made Wed Sep 13 02:08:25 2006 PDT using DSA key ID F3119B9A
gpg: Good signature from "Junio C Hamano <junkio@cox.net>"
gpg:                 aka "[jpeg image of size 1513]"
Primary key fingerprint: 3565 2A26 2040 E066 C9A7  4A7D C0C6 D9A4 F311 9B9A

Kung ikaw ay walang pampublikong susi ng taga-sign, makakuha ka ng isang bagay na tulad nito sa halip:

gpg: Signature made Wed Sep 13 02:08:25 2006 PDT using DSA key ID F3119B9A
gpg: Can't check signature: public key not found
error: could not verify the tag 'v1.4.2.1'

Pag-sign ng mga Commit

Sa mas kamakailan na mga bersyon ng Git (v1.7.9 at pataas), maaari mo na ring ngayon mag-sign ng indibidwal na mga commit. Kung ikaw ay interesado sa pag-sign ng mga commit na direkta sa halip na mga tag lamang, ang kailangan mo lang gawin ay idagdag ang -S sa iyong git commit na utos.

$ git commit -a -S -m 'signed commit'

You need a passphrase to unlock the secret key for
user: "Scott Chacon (Git signing key) <schacon@gmail.com>"
2048-bit RSA key, ID 0A46826A, created 2014-06-04

[master 5c3386c] signed commit
 4 files changed, 4 insertions(+), 24 deletions(-)
 rewrite Rakefile (100%)
 create mode 100644 lib/git.rb

Para tingnan at i-verify ang mga pirma na ito, mayroon ding isang --show-signature na opsyon sa git log.

$ git log --show-signature -1
commit 5c3386cf54bba0a33a32da706aa52bc0155503c2
gpg: Signature made Wed Jun  4 19:49:17 2014 PDT using RSA key ID 0A46826A
gpg: Good signature from "Scott Chacon (Git signing key) <schacon@gmail.com>"
Author: Scott Chacon <schacon@gmail.com>
Date:   Wed Jun 4 19:49:17 2014 -0700

    signed commit

Bukod pa dito, maaari mong i-configure ang git log upang tingnan ang anumang mga pirma na makikita at ilista sila sa kanilang output na may %G? na format.

$ git log --pretty="format:%h %G? %aN  %s"

5c3386c G Scott Chacon  signed commit
ca82a6d N Scott Chacon  changed the version number
085bb3b N Scott Chacon  removed unnecessary test code
a11bef0 N Scott Chacon  first commit

Dito makikita natin na ang mga pinakabagong commit lamang ang naka-sign at balido at ang nakaraang mga commit ay hindi.

Sa git 1.8.3 at pataas, ang git merge at git pull ay maaaring magsabi upang siyasatin at tanggihan kapag nag-merge ng commit na hindi nagdadala ng isang pinagkakatiwalang GPG na pirma na may --verify-signatures na utos.

Kung gamitin mo ang opsyon na ito kapag nag-merge ng branch at ito ay naglalaman ng mga commit na hindi naka-sign at balido, ang merge ay hindi gagana.

$ git merge --verify-signatures non-verify
fatal: Commit ab06180 does not have a GPG signature.

Kung ang merge ay naglalaman lamang ng balido na naka-sign na mga commit, ang merge na utos ay nagpapakita sa iyo ng lahat ng mga pirma na sinuri nito at pagkatapos ay sumulong na may merge.

$ git merge --verify-signatures signed-branch
Commit 13ad65e has a good GPG signature by Scott Chacon (Git signing key) <schacon@gmail.com>
Updating 5c3386c..13ad65e
Fast-forward
 README | 2 ++
 1 file changed, 2 insertions(+)

Maaari mo ring gamitin ang -S na opsyon na may git merge na utos upang pirmahan ang nagreresultang merge na commit mismo. Ang sumusunod na halimbawa ay parehong nagpapatunay na ang bawat commit sa branch na imi-merge ay nakapirma at saka ang mga pirma na nagreresulta ng merge commit.

$ git merge --verify-signatures -S  signed-branch
Commit 13ad65e has a good GPG signature by Scott Chacon (Git signing key) <schacon@gmail.com>

You need a passphrase to unlock the secret key for
user: "Scott Chacon (Git signing key) <schacon@gmail.com>"
2048-bit RSA key, ID 0A46826A, created 2014-06-04

Merge made by the 'recursive' strategy.
 README | 2 ++
 1 file changed, 2 insertions(+)

Bawat Tao ay Dapat Mag-sign

Pag-sign ng mga tag at mga commit ay malaki, ngunit kung magpasya ka ng gamitin ito sa iyong normal na workflow, kailangan mong tiyakin na ang lahat sa iyong koponan ay naiitindihan kung paano gawin ito. Kung hindi, ikaw ay mapupunta sa pagtatagal ng paggamit sa oras sa pagtulong ng tao kung papaano mag-rewrite ng kanilang mga commit na may naka-sign na mga bersyon. Siguraduhin mo na naiitindihan mo ang GPG at ang mga benepisyo ng pag-sign ng mga bagay bago gamitin ito bilang bahagi ng iyong standard na workflow.