본문 바로가기
개발/개발공부

Go-git / golang, git client, 깃, github

by 치킨개발자 2023. 3. 19.
728x90

go-git

go-git


Go를 사용하면서 git-client가 필요할 때 사용하는 라이브러리

https://github.com/go-git/go-git

 

GitHub - go-git/go-git: A highly extensible Git implementation in pure Go.

A highly extensible Git implementation in pure Go. - GitHub - go-git/go-git: A highly extensible Git implementation in pure Go.

github.com

pure Go

로 되어있어서 빠르고, 가벼운 것이 장점그 외에도 Docs, examples가 잘 설명되어있고 go git client중 가장 대중적임근데 아직 다른 언어생태계에 비해 기능지원이 부족한 것으로 보임예를 들면 local git-credentials를 사용하는 방법이 없다던지..

 

사용법


go get github.com/go-git/go-git/v5
import "github.com/go-git/go-git/v5" // with go modules enabled (GO111MODULE=on or outside GOPATH)
import "github.com/go-git/go-git" // with go modules disabled

위의 방식으로 go get을 하여 다운로드 받고, import하여 사용

version 명시도 가능

 

난 보통 $HOME directory를 기준으로 작업을 할 것 같아

dirname, err := os.UserHomeDir()
if err != nil {
    log.Fatal(err)
}
fmt.Println(dirname)

repository작업을 할 땐, 이렇게 $HOME값을 가져와서 사용했다.

 

1. git clone

repo, err := git.PlainClone(dirname+"/dev-chicken/foo", false, &git.CloneOptions{
    Auth: &http.BasicAuth{
        Username: "dev-chicken",
        Password: "password",
    },
    URL:               "<git-repo>",
    RecurseSubmodules: git.DefaultSubmoduleRecursionDepth,
})
if err != nil {
    return err
}

앞서 $HOME값을 가져와서 설치할 directory를 사용하고,

private repo인 경우에는 Auth가 필요함 optional하게 사용

URL은 말그대로 git-repo를 넣어주고, RecurseSubmodules는 git clone하는 submodule depth까지 지정 가능

DefaultSubmoduleRecursionDepth SubmoduleRescursivity = 10

default값은 10으로 되어있음

 

2. git open

repository, err := git.PlainOpen(dirname + "/dev-chicken/foo")

clone받은 repository를 가져오는 부분

말그대로 가져오는 것

 

3. git add / git commit

worktree, err := repository.Worktree()
_, err = os.Create(dirname + "/dev-chicken/foo/test.txt")
if err != nil {
    panic(err)
}
worktree.Add(".")

commit, err := worktree.Commit("test", &git.CommitOptions{
    Author: &object.Signature{
        Name:  "dev-chicken",
        Email: "dev-chicken@tistory.com",
        When:  time.Now(),
    },
})

obj, err := repository.CommitObject(commit)

worktree는 branch를 의미하는 것으로 보이는데, 나는 간단하게 git-client를 사용하면 되서 그냥 바로 진행했다.

간단하게 test.txt파일을 생성하고, worktree.Add(".")를 통해해당 디렉토리의 모든 파일을 Add했다.

commit object를 생성하고 repository에 commit까지 진행

 

"test"를 commit 메세지로 추가했다.

commit할때 name, email은 보통 local에 저장된 git global config를 사용하는데, 나는 직접 입력해줬다.

exec command와 같은 것을 통해 git global config를 가져와 사용해도 될 것 같음

time.Now()로 현재 시간을 사용

 

4. git push

err = repository.Push(&git.PushOptions{
    Auth: &http.BasicAuth{
        Username: "dev-chicken",
        Password: "password",
    },
})
if err != nil {
    return err
}

마지막으로 Commit된 것을 push

이때도 Auth를 사용해서 push한다.


go-git examples

go-git examples를 보면 여러가지 기능들이 있다.

pull, remotes, submodule, tag, merge_base.... 등등

validation을 적절하게 잘 섞으면(ex. commit을 잘못 작성한다던지.. ㅋㅋㅋ), git-client로 평소에 자주 사용되는 git기능은 대부분 사용 가능할 것으로 보인다.

가장 불편한 git-crendentials 지원은 현재 작업 중인것으로 보이는데 너무 느린 듯..

반응형

댓글