Codesigner

[Git] Git Advanced - 태그(tag)의 생성, 조회, 서명 그리고 검증 및 공유 본문

Git /git

[Git] Git Advanced - 태그(tag)의 생성, 조회, 서명 그리고 검증 및 공유

eunsukimme 2019. 4. 15. 20:03

Git에서는 tag(태그)를 지원한다. 이는 보통 릴리즈 할 때 사용되는데(v.1.0, 등), 이번 포스팅에서는 태그를 생성하고 조회하는 법 그리고 서명하고 검증하는 법과 공유하는 법, 태그의 두 종류를 알아보도록 하자

 

 

 

git tag - 태그 조회하기

 

Git 프로젝트에서 이미 만들어진 태그가 있는지 확인하는 명령은 다음과 같다

git tag

위 명령은 태그들을 알파벳 순서로 나열한다. 검색 패턴을 사용하여 태그를 검색할 수도 있는데, 예를 들어 여러 가지 버전 중 1.1.3 버전의 태그들만 검색하고 싶다면 다음과 같이 명령할 수 있다

git tag -l 'v1.1.3.*'

위 명령은 v1.1.3.1, v.1.1.3.2 등 1.1.3 버전들을 나열한다

 

 

 

태그의 두 종류 - Annotated & Lightweight

 

Git의 태그는 Annotated 태그와 Lightweight 태그로 두 종류가 있다. Lightweight태그는 단순히 특정 커밋에 대한 포인터인 반면, Annotated 태그는 Git 프로젝트에 태그를 만든 사람의 이름, 이메일, 날짜, 그리고 메시지도 저장한다. 또 GPG(GNU Privacy Guard)로 커밋에 서명도 할 수 있다. 이 모든 정보를 저장해둬야 할 필요가 있을 때에만 Annotated 태그를 사용하고, 보통은 Lightweight 태그를 사용하는 것이 좋다

 

 

 

Annotated 태그

 

Annotated 태그를 만드는 방법은 간단한데, tag 명령 뒤에 -a 옵션을 추가하는 것이다

git tag -a v0.2 -m 'beta version 0.2'

-m 옵션으로 태그를 저장할 때 메시지를 함께 저장할 수 있다. 만약 옵션으로 주지 않으면 Git 은 편집기를 실행하여 메시지를 입력하게 한다. git show 명령으로 태그 정보와 커밋들을 확인할 수 있다

C:\Users\glafu\Desktop\git_tag_test>git tag -a v0.2 -m "beta version 0.2"

C:\Users\glafu\Desktop\git_tag_test>git show v0.2
tag v0.2
Tagger: eunsukimme <eunsu.dev@gmail.com>
Date:   Mon Apr 15 17:35:32 2019 +0900

beta version 0.2

commit ec5732f4cbf8f4e1de684386bb87984cca3f4f8a (HEAD -> master, tag: v0.2)
Author: eunsukimme <eunsu.dev@gmail.com>
Date:   Mon Apr 15 17:31:48 2019 +0900

    Add third line

커밋 정보를 보여주기 전에 먼저 태그를 만든 사람이 누구인지(tagger), 언제 만들었는지(Date), 그리고 태그 메시지가 무엇인지(beta version 0.2) 보여준다

 

 

 

태그에 서명하기

 

GPG개인키가 있으면 태그에 서명할 수 있다. 이때에는 -a 옵션 대신 -s를 사용한다

git tag -s v1.5 -m "my signed 1.5 tag"

이때, GPG 개인키가 먼저 존재해야 하는데, 다음 명령으로 개인키가 존재하는지 간단히 확인할 수 있다

gpg --list-key

만약 이 명령을 최초로 실행했다면, 다음과 같이 나올 것이다

C:\Users\glafu\Desktop\git_tag_test>gpg --list-key
gpg: /c/Users/glafu/.gnupg/trustdb.gpg: trustdb created

C:\Users\glafu\Desktop\git_tag_test>

trustdb 를 최초로 생성한 것이다. 만약 이전에 생성하였다면, 빈 줄 또는 이전에 생성한 GPG키들이 보일 것이다. 키가 존재하지 않는 경우 다음과 같은 명령으로 GPG 키를 생성할 수 있다

gpg --gen-key

그러면 다음과 같은 안내 결과가 출력된다

C:\Users\glafu\Desktop\git_tag_test>gpg --gen-key
gpg (GnuPG) 1.4.21; Copyright (C) 2015 Free Software Foundation, Inc.
This is free software: you are free to change and redistribute it.
There is NO WARRANTY, to the extent permitted by law.

Please select what kind of key you want:
   (1) RSA and RSA (default)
   (2) DSA and Elgamal
   (3) DSA (sign only)
   (4) RSA (sign only)
Your selection?

다음과 같이 어떤 암호 알고리즘을 선택하여 키를 생성할 것인지 정하라고 나온다. 디폴트는 RSA이고, 이후에 차례대로 키 사이즈와 유효기간을 설정할 수 있다. 키 사이즈는 디폴트로 2048이고, 유효기간은 디폴트로 무기한이다

RSA keys may be between 1024 and 4096 bits long.
What keysize do you want? (2048)
Requested keysize is 2048 bits
Please specify how long the key should be valid.
         0 = key does not expire
      <n>  = key expires in n days
      <n>w = key expires in n weeks
      <n>m = key expires in n months
      <n>y = key expires in n years
Key is valid for? (0)
Key does not expire at all
Is this correct? (y/N)

설정을 마치고 y 를 입력하면 ID를 생성하라고 나오는데, GPG키를 식별하기 위한 식별자를 생성하라는 것이다. Real name, Comment, Email 세 가지를 입력받고 그 결과로 USER-ID를 생성해낸다. 과정은 다음과 같다

You need a user ID to identify your key; the software constructs the user ID
from the Real Name, Comment and Email Address in this form:
    "Heinrich Heine (Der Dichter) <heinrichh@duesseldorf.de>"

Real name: Eunsu Kim
Email address: eunsu.dev@gmail.com
Comment: gpg for eunsukimme
You selected this USER-ID:
    "Eunsu Kim (gpg for eunsukimme) <eunsu.dev@gmail.com>"

Change (N)ame, (C)omment, (E)mail or (O)kay/(Q)uit?

O를 누르면 마지막으로 비밀키를 보호할 비밀번호를 입력하라고 나온다. 비밀번호까지 모두 입력하면 최종적으로 GPG공개키와 비밀키가 만들어진다

You need a Passphrase to protect your secret key.

We need to generate a lot of random bytes. It is a good idea to perform
some other action (type on the keyboard, move the mouse, utilize the
disks) during the prime generation; this gives the random number
generator a better chance to gain enough entropy.
...+++++
..+++++
We need to generate a lot of random bytes. It is a good idea to perform
some other action (type on the keyboard, move the mouse, utilize the
disks) during the prime generation; this gives the random number
generator a better chance to gain enough entropy.
+++++
.........+++++
gpg: key 8412055D marked as ultimately trusted
public and secret key created and signed.

gpg: checking the trustdb
gpg: 3 marginal(s) needed, 1 complete(s) needed, PGP trust model
gpg: depth: 0  valid:   1  signed:   0  trust: 0-, 0q, 0n, 0m, 0f, 1u
pub   2048R/8412055D 2019-04-15
      Key fingerprint = 739A 50E8 A389 099A 6F05  1100 C760 DA56 8412 055D
uid                  Eunsu Kim (gpg for eunsukimme) <eunsu.dev@gmail.com>
sub   2048R/70CA2333 2019-04-15


C:\Users\glafu\Desktop\git_tag_test>

생성된 키의 체크섬은 8412055D 인데, 이를 Git에서 사용할 수 있게 다음과 같이 설정해주면 된다

C:\Users\glafu\Desktop\git_tag_test>git config --global user.signingkey 8412055D

C:\Users\glafu\Desktop\git_tag_test>

자, 이제 Git 프로젝트에서 우리의 GPG 키로 태그에 서명할 수 있다

C:\Users\glafu\Desktop\git_tag_test>git tag -s v1.0 -m "my signed 1.0 tag"

You need a passphrase to unlock the secret key for
user: "Eunsu Kim (gpg for eunsukimme) <eunsu.dev@gmail.com>"
2048-bit RSA key, ID 8412055D, created 2019-04-15

비밀번호를 입력하고 나면 서명이 생성된다. git show 명령으로 커밋과 GPG서명을 확인할 수 있다

C:\Users\glafu\Desktop\git_tag_test>git show v1.0
tag v1.0
Tagger: eunsukimme <eunsu.dev@gmail.com>
Date:   Mon Apr 15 18:04:29 2019 +0900

my signed 1.0 tag
-----BEGIN PGP SIGNATURE-----

iQEcBAABAgAGBQJctEkdAAoJEMdg2laEEgVd6DAIAKf8ABm8bxT79KBXSQqbcarF
Tj8UiuaMdn6e2+yKlCHCvTQX/XXO07V0cjfxinFU7Ak+5tV2PfmEOaqwBItwaxco
kNW2O4hSWLibfGF/jdYvrWwdgBHNLSNLR1i2/xDJloo+Z4uyJW8gTg1Jh5Aw12Sj
kzmCvc7wny/L4M19z792QUSC4HNCTQeQrb/qc/pH1B3PqOiiBfV05ajNLd8xkGSD
wO5udpYh1zJ9NdJcP2uZDqYxnghXldVG2LLbvtB7IltJwk1KgPZuDWE9r0iXJI1l
UKtq/Zmy6Qx7te7xLFdcJm7GNgZKLr4YxLEpVT5/40MsKMEzgAiNCZKIxa/ReHw=
=Wyuc
-----END PGP SIGNATURE-----

commit ec5732f4cbf8f4e1de684386bb87984cca3f4f8a (HEAD -> master, tag: v1.0, tag: v0.2)
Author: eunsukimme <eunsu.dev@gmail.com>
Date:   Mon Apr 15 17:31:48 2019 +0900

    Add third line

잠시 후에 서명한 태그를 검증하는 방법도 설명하겠다

 

 

 

Lightweight 태그

 

Lightweight 태그는 기본적으로 파일에 커밋 체크섬을 저장하는 것뿐이다. 다른 정보는 저장하지 않는다. Lightweight 태그를 만들 때에 옵션은 사용하지 않는다

C:\Users\glafu\Desktop\git_tag_test>git tag v1.4-lw

C:\Users\glafu\Desktop\git_tag_test>git tag
v0.2
v1.0
v1.4-lw

C:\Users\glafu\Desktop\git_tag_test>

이 태그에 git show 명령을 실행하면 별도의 태그 정보를 확인할 수 없다. 이 명령은 단순히 커밋 정보만을 보여준다

 

 

 

태그 검증하기

 

다음 명령으로 서명한 태그를 검증할 수 있다

git tag -v 태그이름

위 명령은 GPG를 이용하여 서명을 검증한다. 그래서 서명자의 GPG 공개키가 필요하고, 이 공개키가 Keyring에 존재해야만 검증이 성공적으로 이루어진다. 조금 전에 생성한 v1.0 태그를 검증해보면 다음과 같다

C:\Users\glafu\Desktop\git_tag_test>git tag -v v1.0
gpg: Signature made Mon Apr 15 18:04:29 2019
gpg:                using RSA key C760DA568412055D
gpg: Good signature from "Eunsu Kim (gpg for eunsukimme) <eunsu.dev@gmail.com>"
object ec5732f4cbf8f4e1de684386bb87984cca3f4f8a
type commit
tag v1.0
tagger eunsukimme <eunsu.dev@gmail.com> 1555319069 +0900

my signed 1.0 tag

C:\Users\glafu\Desktop\git_tag_test>

서명 검증에 사용된 공개키의 소유주(USER-ID)와 커밋 체크섬, 태그 이름, 날짜, 메시지 모두 출력되는걸 확인할 수 있다

 

 

 

이전 커밋에 태그하기

 

지금까지는 가장 최근에 만든 커밋에 태그 했다. 커밋 히스토리를 확인해보면 모든 태그가 HEAD에 붙어있는 걸 확인할 수 있다

C:\Users\glafu\Desktop\git_tag_test>git log
commit ec5732f4cbf8f4e1de684386bb87984cca3f4f8a (HEAD -> master, tag: v1.4-lw, tag: v1.0, tag: v0.2)
Author: eunsukimme <eunsu.dev@gmail.com>
Date:   Mon Apr 15 17:31:48 2019 +0900

    Add third line

commit 238f6b95197055ec9b935de9a2235b9d6531c7d6
Author: eunsukimme <eunsu.dev@gmail.com>
Date:   Mon Apr 15 17:31:29 2019 +0900

    Add second line

commit bf0944088614c548b574eebedba095eed5ce54b8
Author: eunsukimme <eunsu.dev@gmail.com>
Date:   Mon Apr 15 17:31:05 2019 +0900

    Init commit

C:\Users\glafu\Desktop\git_tag_test>

만약 첫 번째 커밋에 태그 하고 싶다면, git tag 명령에 커밋 체크섬을 파라미터로 넘겨준다

C:\Users\glafu\Desktop\git_tag_test>git tag -a v0.1 -m "version 0.1" bf09440

C:\Users\glafu\Desktop\git_tag_test>

커밋 히스토리를 보면 태그가 첫 번째 커밋에 잘 붙어있는 걸 확인할 수 있다

C:\Users\glafu\Desktop\git_tag_test>git log
commit ec5732f4cbf8f4e1de684386bb87984cca3f4f8a (HEAD -> master, tag: v1.4-lw, tag: v1.0, tag: v0.2)
Author: eunsukimme <eunsu.dev@gmail.com>
Date:   Mon Apr 15 17:31:48 2019 +0900

    Add third line

commit 238f6b95197055ec9b935de9a2235b9d6531c7d6
Author: eunsukimme <eunsu.dev@gmail.com>
Date:   Mon Apr 15 17:31:29 2019 +0900

    Add second line

commit bf0944088614c548b574eebedba095eed5ce54b8 (tag: v0.1)
Author: eunsukimme <eunsu.dev@gmail.com>
Date:   Mon Apr 15 17:31:05 2019 +0900

    Init commit

C:\Users\glafu\Desktop\git_tag_test>

 

 

 

태그 공유하기

 

git push 명령은 리모트 레포지토리에 태그를 자동으로 전송하지 않는데, 태그를 만들었으면 별도로 push 해야 한다. 브랜치를 공유하는 방법과 비슷한데, 다음과 같은 명령으로 push 하면 된다

git push origin 태그이름

만약 한 번에 여러 태그를 push 하고 싶으면 --tags 옵션을 추가하면 된다. 이 명령은 리모트 서버에 없는 태그를 모두 전송할 수 있다

C:\Users\glafu\Desktop\git_tag_test>git push origin --tags
fatal: HttpRequestException encountered.
   이 요청을 보내는 동안 오류가 발생했습니다.
Username for 'https://github.com': eunsukimme
Password for 'https://eunsukimme@github.com':
Counting objects: 3, done.
Delta compression using up to 8 threads.
Compressing objects: 100% (3/3), done.
Writing objects: 100% (3/3), 777 bytes | 111.00 KiB/s, done.
Total 3 (delta 0), reused 0 (delta 0)
To https://github.com/eunsukimme/git_tag_test.git
 * [new tag]         v0.1 -> v0.1
 * [new tag]         v0.2 -> v0.2
 * [new tag]         v1.0 -> v1.0
 * [new tag]         v1.4-lw -> v1.4-lw

C:\Users\glafu\Desktop\git_tag_test>

이렇게 해서 누군가 저장소에서 clone 하거나 pull 하게 되면 모든 태그 정보도 함께 전송된다

 

 

 

Generalizations

 

지금까지 Git에서 태그 생성, 조회, 서명 및 검증 방법 그리고 공유하는 법을 알아보았다. 배운 내용들을 정리하면 다음과 같다

 

  • 태그에는 두 종류가 있는데, Annotated 태그와 Lightweight 태그가 있다
  • Annotated 태그는 커밋 체크섬, 태그를 만든 사람, 날짜, 메시지를 포함한다
  • Lightweight 태그는 파일에 커밋 체크섬만을 포함하고, 다른 정보는 저장하지 않는다
  • 태그에 서명할 수 있는데, 이를 위해선 서명자의 GPG 개인키가 필요하다
  • 태그의 서명을 검증할 수 있는데, 이를 위해선 서명자의 GPG 공개키가 필요하다

 

그리고 배운 명령들은 다음과 같다. 아래의 태그를 생성하는 명령에서 커밋 체크섬을 파라미터로 넘겨주면 해당 커밋에 태그를 생성하고, 그렇지 않으면 가장 최근에 만들어진 커밋(HEAD)에 태그 한다

 

  • git tag - 만들어진 태그들을 나열한다
  • git tag 태그이름 - Lightweight 태그를 생성한다
  • git tag -a 태그이름 -m "메시지내용" - Annotated 태그를 생성한다
  • git tag -s 태그이름 -m "메시지내용" - Annotated 태그를 생성하고 서명한다. GPG 개인키가 필요하다
  • git tag -v 태그이름 - 서명된 태그를 검증한다. GPG 공개키가 필요하다
  • git push origin --tags - 한 번에 여러 태그를 리모트 서버에 push 한다

 

 

지금까지 Git의 태그에 대해서 알아보았다. 버전 관리 시스템에서 버전을 관리하는 데 있어서 태그는 가장 핵심적인 기능을 하니 태그에 대해서 잘 알아두도록 하자.

 

 

Comments