Git의 데이터들을 다루기 위해서 Python을 이용해서 스크립트를 종종 만들고 있다.
지금까지는 subprocess를 사용해서
외부 명령어(git)를 실행하고 그 결과를 String으로 받아서 파싱하는 방식으로 만들었는데...
(혼자서 나만의 Git Class를 만들어서, 쿵짝쿵짝... ^^)
Python Library로 제공되는 것이 있지 않을까 좀 찾아보았더니... 당연히(?) 있다!
GitPython 0.3.2 RC1 (Python Git Library) : 2011-07-06
https://pypi.python.org/pypi/GitPython/0.3.2.RC1
Package Documentation
GitPython is a python library used to interact with Git repositories.
Author : Sebastian Thiel, Michael Trier
Documentation : GitPython package documentation
Home Page : http://gitorious.org/projects/git-python/
License : BSD License
Requires : gitdb (>=0.5.1)
Package Index Owner : Sebastian.Thiel, mtrier
Package Index Maintainer : Sebastian.Thiel
DOAP record : GitPython-0.3.2.RC1.xml
https://pypi.python.org/pypi/GitPython/0.3.2.RC1
Package Documentation
GitPython is a python library used to interact with Git repositories.
Author : Sebastian Thiel, Michael Trier
Documentation : GitPython package documentation
Home Page : http://gitorious.org/projects/git-python/
License : BSD License
Requires : gitdb (>=0.5.1)
Package Index Owner : Sebastian.Thiel, mtrier
Package Index Maintainer : Sebastian.Thiel
DOAP record : GitPython-0.3.2.RC1.xml
gitdb 0.5.4 (Git Object Database) : 2011-07-05
https://pypi.python.org/pypi/gitdb
Package Documentation
GitDB is a pure-Python git object database
Author : Sebastian Thiel
Documentation : gitdb package documentation
Home Page : https://github.com/gitpython-developers/gitdb
License : BSD License
Requires : async (>=0.6.1), smmap (>=0.8.0)
Package Index Owner : Sebastian.Thiel
DOAP record : gitdb-0.5.4.xml
https://pypi.python.org/pypi/gitdb
Package Documentation
GitDB is a pure-Python git object database
Author : Sebastian Thiel
Documentation : gitdb package documentation
Home Page : https://github.com/gitpython-developers/gitdb
License : BSD License
Requires : async (>=0.6.1), smmap (>=0.8.0)
Package Index Owner : Sebastian.Thiel
DOAP record : gitdb-0.5.4.xml
Ubuntu를 사용하게 되면 정말 편리한 점 중에서 한 가지가 바로 Package 관리인데...
주어진대로 사용을 하면 편리하지만, 직접 설치해서 뭔가 하려하면 오히려 번거로운 부분도 많다.
Python도 마찬가지인데 Python과 관련된 전부를 다운로드 받아서 직접 설치한 것이 아니라면
그 외 나머지들도 그냥 패키지로 설치하는 것이 편리하다.
위의 라이브러리들도 마찬가지인데...
이미 Python을 Ubuntu에서 제공하는 패키지로 설치해서 사용하고 있기에,
그냥 Ubuntu에서 제공해주는 패키지로 설치를 해보려고 했는데...
아래와 같이 하면 설치는 되는데... Ubuntu 버전에 따라 제공하는 버전이 다르다.
$ sudo apt-get install python-git
현재(2014.06) 제공하는 버전은 아래와 같다.
Version | Release | python-git version |
14.04 | Trusty Tahr | 0.3.2~RC1-3 |
13.10 | Saucy Salamander | 0.3.2~RC1-2 |
13.04 | Raring | 0.3.2~RC1-1 |
12.04 | Precise Pangolin | 0.1.6-1 |
10.04 | Lucid Lynx | 0.1.6-1 |
위와 같이 설치하면 편하기는 하지만, 쓸데없는(?) 부가 패키지들도 같이 설치를 한다.
$ sudo apt-get install python-git 패키지 목록을 읽는 중입니다... 완료 의존성 트리를 만드는 중입니다 상태 정보를 읽는 중입니다... 완료 다음 패키지를 더 설치할 것입니다: git git-man liberror-perl libjs-jquery python-async python-gitdb python-smmap 제안하는 패키지: git-daemon-run git-daemon-sysvinit git-doc git-el git-email git-gui gitk gitweb git-arch git-bzr git-cvs git-mediawiki git-svn javascript-common 다음 새 패키지를 설치할 것입니다: git git-man liberror-perl libjs-jquery python-async python-git python-gitdb python-smmap 0개 업그레이드, 8개 새로 설치, 0개 제거 및 0개 업그레이드 안 함. 3,780 k바이트 아카이브를 받아야 합니다. 이 작업 후 23.5 M바이트의 디스크 공간을 더 사용하게 됩니다. 계속 하시겠습니까? [Y/n] |
특히 git과 관련한 패키지들도 설치를 하게 되는데, git을 source로 직접 설치한 경우 불필요하고 번거롭기만 하다.
그러면, python-git을 개별 설치하려면 어떻게 해야할까?!
원하는 최신 버전으로 설치하기 위해서는 다음과 같이 수행하자.
$ sudo apt-get install python-setuptools python-dev
$ sudo easy_install GitPython
$ sudo easy_install GitPython
간단하다.
현재(2014.06) 설치되는 버전은 '0.3.2~RC1'이다.
잘 동작하는지 테스트를 해보기 위해서는 다음과 같이 해보자.
$ git clone https://github.com/git/git.git
아래 샘플 코드로 돌려보자~
#!/usr/bin/python
# -*- coding: utf-8 -*-
import git
import os
import sys
import time
if __name__ == "__main__":
#for i in range(len(sys.argv)):
# print "sys.argv[%d] = '%s'" % (i, sys.argv[i])
#repo = git.Repo.clone_from( URL_SOURCE, PATH_TARGET )
if len(sys.argv) < 2:
sys.exit('Usage: %s repository-name' % sys.argv[0])
if not os.path.isdir(sys.argv[1]):
sys.exit('ERROR: Repository %s was not found!' % sys.argv[1])
PATH_TARGET = sys.argv[1]
repo = git.Repo( PATH_TARGET )
for remote in repo.remotes:
print "[ " + str(remote) + " branches ]"
for branch in getattr(repo.remotes, str(remote)).refs:
print " " + str(branch).replace( str(remote)+"/", "" )
for commit in repo.iter_commits(branch, max_count=3):
print ""
print " Commit : ", commit
print " Author : ", commit.author, ", (",
print time.asctime(time.gmtime(commit.authored_date)), ")"
print " Committer : ", commit.committer, ", (",
print time.asctime(time.gmtime(commit.committed_date)), ")"
print " Encoding : ", commit.encoding
print " Summary : ", commit.summary
print " Delta LOC : ", commit.stats.total['lines'], " (+",
print commit.stats.total['insertions'], ", -",
print commit.stats.total['deletions'], ")"
#print commit.stats.files
#print " Message : ", commit.message
#print " Parents : ", commit.parents
print ""
print "[ Local branches ]"
for branch in repo.branches:
print " " + str(branch)
#commits = list( repo.iter_commits(branch, max_count=10) )
for commit in repo.iter_commits(branch, max_count=3):
print ""
print " Commit : ", commit
print " Author : ", commit.author, ", (",
print time.asctime(time.gmtime(commit.authored_date)), ")"
print " Committer : ", commit.committer, ", (",
print time.asctime(time.gmtime(commit.committed_date)), ")"
print " Encoding : ", commit.encoding
print " Summary : ", commit.summary
print " Delta LOC : ", commit.stats.total['lines'], " (+",
print commit.stats.total['insertions'], ", -",
print commit.stats.total['deletions'], ")"
#print commit.stats.files
#print " Message : ", commit.message
#print " Parents : ", commit.parents
# -*- coding: utf-8 -*-
import git
import os
import sys
import time
if __name__ == "__main__":
#for i in range(len(sys.argv)):
# print "sys.argv[%d] = '%s'" % (i, sys.argv[i])
#repo = git.Repo.clone_from( URL_SOURCE, PATH_TARGET )
if len(sys.argv) < 2:
sys.exit('Usage: %s repository-name' % sys.argv[0])
if not os.path.isdir(sys.argv[1]):
sys.exit('ERROR: Repository %s was not found!' % sys.argv[1])
PATH_TARGET = sys.argv[1]
repo = git.Repo( PATH_TARGET )
for remote in repo.remotes:
print "[ " + str(remote) + " branches ]"
for branch in getattr(repo.remotes, str(remote)).refs:
print " " + str(branch).replace( str(remote)+"/", "" )
for commit in repo.iter_commits(branch, max_count=3):
print ""
print " Commit : ", commit
print " Author : ", commit.author, ", (",
print time.asctime(time.gmtime(commit.authored_date)), ")"
print " Committer : ", commit.committer, ", (",
print time.asctime(time.gmtime(commit.committed_date)), ")"
print " Encoding : ", commit.encoding
print " Summary : ", commit.summary
print " Delta LOC : ", commit.stats.total['lines'], " (+",
print commit.stats.total['insertions'], ", -",
print commit.stats.total['deletions'], ")"
#print commit.stats.files
#print " Message : ", commit.message
#print " Parents : ", commit.parents
print ""
print "[ Local branches ]"
for branch in repo.branches:
print " " + str(branch)
#commits = list( repo.iter_commits(branch, max_count=10) )
for commit in repo.iter_commits(branch, max_count=3):
print ""
print " Commit : ", commit
print " Author : ", commit.author, ", (",
print time.asctime(time.gmtime(commit.authored_date)), ")"
print " Committer : ", commit.committer, ", (",
print time.asctime(time.gmtime(commit.committed_date)), ")"
print " Encoding : ", commit.encoding
print " Summary : ", commit.summary
print " Delta LOC : ", commit.stats.total['lines'], " (+",
print commit.stats.total['insertions'], ", -",
print commit.stats.total['deletions'], ")"
#print commit.stats.files
#print " Message : ", commit.message
#print " Parents : ", commit.parents
공식 매뉴얼과 가이드는 다음에서 확인할 수 있다.
http://pythonhosted.org/GitPython/0.3.2/tutorial.html
http://pythonhosted.org/GitPython/0.3.2/reference.html
반응형
'Programming > Python' 카테고리의 다른 글
카카오톡 봇 만들어보기 (with Python) (2) | 2018.10.28 |
---|---|
삼성 링크 / AllShare .mta 파일 삭제하기 (0) | 2014.08.17 |
윈도우즈 환경에서 파이썬 실행하기 (0) | 2014.08.17 |
GitPython : remote.fetch() 에러 (0) | 2014.07.06 |
나는 누군가 또 여긴 어딘가 ? [ path ] (1) | 2013.05.08 |