Python Git Module 경험이 있습니까?
Python용 Git 모듈에 대한 사람들의 경험은 무엇입니까?(Git Python, PyGit, Dulwich에 대해 알고 있습니다 - 다른 사람들에 대해 알고 있다면 자유롭게 언급하세요.)
저는 Git 저장소와 상호 작용(추가, 삭제, 커밋)해야 하지만 Git에 대한 경험이 없기 때문에 Git에 대한 사용 편의성/이해력을 찾고 있는 프로그램을 작성하고 있습니다.
제가 주로 관심을 가지고 있는 다른 것들은 도서관의 성숙도와 완성도, 합리적으로 부족한 버그, 지속적인 개발, 그리고 문서와 개발자들의 도움입니다.
제가 알고 싶은 것이 또 생각나시면 언제든지 말씀해 주시기 바랍니다.
얼마 전에 이 질문이 제기되었고 그 시점의 라이브러리 상태를 잘 모르지만, GitPython이 하위 프로세스를 사용할 필요가 없도록 명령줄 도구를 추상화하는 작업을 잘 수행한다는 것은 검색자에게 언급할 가치가 있습니다.사용할 수 있는 몇 가지 유용한 기본 추상화가 있지만 그 외의 모든 경우 다음과 같은 작업을 수행할 수 있습니다.
import git
repo = git.Repo( '/home/me/repodir' )
print repo.git.status()
# checkout and track a remote branch
print repo.git.checkout( 'origin/somebranch', b='somebranch' )
# add a file
print repo.git.add( 'somefile' )
# commit
print repo.git.commit( m='my commit message' )
# now we are one commit ahead
print repo.git.status()
GitPython의 다른 모든 것들은 단지 탐색을 더 쉽게 할 뿐입니다.저는 이 라이브러리에 상당히 만족하며 기본 깃 도구의 포장지라는 것에 감사합니다.
업데이트: 저는 git뿐만 아니라 python에 필요한 대부분의 명령줄 유틸리티에 sh 모듈을 사용하는 것으로 전환했습니다.위의 내용을 복제하기 위해 대신 다음 작업을 수행합니다.
import sh
git = sh.git.bake(_cwd='/home/me/repodir')
print git.status()
# checkout and track a remote branch
print git.checkout('-b', 'somebranch')
# add a file
print git.add('somefile')
# commit
print git.commit(m='my commit message')
# now we are one commit ahead
print git.status()
답변에서 제시한 것과 다른 길을 가고 있기 때문에 저는 제 질문에 답을 해야겠다고 생각했습니다.그럼에도 불구하고, 대답해주신 분들 덕분에.
먼저 Git Python, PyGit 및 Dulwich에 대한 제 경험에 대한 간략한 개요를 말씀드리겠습니다.
- GitPython: 다운로드 후, 저는 이것을 가져와서 적절한 객체를 초기화했습니다.하지만 튜토리얼에서 제안된 것을 시도하는 것은 오류로 이어졌습니다.서류가 더 부족해서 다른 곳으로 눈을 돌렸습니다.
- PyGit: 이것은 수입조차 되지 않을 것이고, 저는 어떤 문서도 찾을 수 없었습니다.
- 둘리치:(적어도 내가 원하고 본 것에 대해서는) 가장 유망한 것 같습니다.그것의 달걀은 파이썬 소스와 함께 제공되기 때문에 나는 GitPython보다 그것으로 약간의 진전을 이루었습니다.하지만, 잠시 후, 저는 제가 한 일을 시도하는 것이 더 쉬울지도 모른다고 결정했습니다.
또한 StGit는 흥미로워 보이지만 별도의 모듈에 기능을 추출해야 하며 지금 당장 그런 일이 발생하기를 원하지 않습니다.
위의 세 모듈을 작동시키기 위해 노력한 시간보다 훨씬 짧은 시간에 하위 프로세스 모듈을 통해 git 명령을 작동할 수 있었습니다.
def gitAdd(fileName, repoDir):
cmd = ['git', 'add', fileName]
p = subprocess.Popen(cmd, cwd=repoDir)
p.wait()
gitAdd('exampleFile.txt', '/usr/local/example_git_repo_dir')
아직 프로그램에 완전히 통합되지는 않았지만 속도를 제외하고는 문제가 발생할 것으로 예상되지 않습니다(가끔 수백 또는 수천 개의 파일을 처리하기 때문에).
어쩌면 저는 덜리치나 깃 파이썬과 함께 일을 진행시킬 인내심이 없었을 수도 있습니다.그렇긴 하지만, 저는 그 모듈들이 곧 더 발전하고 더 유용하게 쓰이기를 희망합니다.
나는 pygit2를 추천합니다 - 그것은 훌륭한 libgit2 바인딩을 사용합니다.
도움이 될 수도 있지만, 바자와 머큐리얼은 모두 Git 상호 운용성을 위해 둘리치를 사용하고 있습니다.
덜위치는 아마도 파이썬에서 깃의 재구현이라는 점에서 다른 것과 다를 것입니다.다른 하나는 Git의 명령어 주변의 래퍼일 수 있습니다(높은 수준의 관점에서 사용하는 것이 더 쉬울 수 있습니다: 커밋/추가/삭제). 이것은 아마도 그들의 API가 Git의 명령줄에 매우 가깝다는 것을 의미하므로 Git에 대한 경험을 쌓아야 합니다.
이것은 꽤 오래된 질문이고, Git 라이브러리를 찾다가 올해(2013년)에 Gittle이라고 불리는 것을 발견했습니다.
그것은 저에게 매우 효과적이었고(제가 시도한 다른 것들은 엉망이었습니다), 일반적인 행동의 대부분을 다루는 것 같습니다.
README의 몇 가지 예:
from gittle import Gittle
# Clone a repository
repo_path = '/tmp/gittle_bare'
repo_url = 'git://github.com/FriendCode/gittle.git'
repo = Gittle.clone(repo_url, repo_path)
# Stage multiple files
repo.stage(['other1.txt', 'other2.txt'])
# Do the commit
repo.commit(name="Samy Pesse", email="samy@friendco.de", message="This is a commit")
# Authentication with RSA private key
key_file = open('/Users/Me/keys/rsa/private_rsa')
repo.auth(pkey=key_file)
# Do push
repo.push()
완전성을 위해 http://github.com/alex/pyvcs/ 은 모든 dvcs를 위한 추상화 계층입니다.Dulwich를 사용하지만 다른 dvcs와 상호 작용을 제공합니다.
변경된 시간을 반영하는 업데이트된 답변:
GitPython은 현재 가장 사용하기 쉽습니다.많은 git 배관 명령의 래핑을 지원하며 플러그인 가능한 객체 데이터베이스(둘리치 중 하나)가 있으며, 명령이 구현되지 않은 경우 명령줄로 셸링하기 위한 쉬운 API를 제공합니다.예:
repo = Repo('.')
repo.checkout(b='new_branch')
다음을 호출:
bash$ git checkout -b new_branch
덜위치도 좋지만 훨씬 낮은 수준입니다.배관 수준에서 깃 물체를 조작해야 하고 일반적으로 하고 싶은 멋진 도자기가 없기 때문에 사용하기가 다소 번거롭습니다.그러나 git의 일부를 수정하거나 git-receive-pack 및 git-upload-pack을 사용할 계획이라면 dulwich를 사용해야 합니다.
PTBNL의 답변은 저에게 매우 완벽합니다.저는 윈도우 사용자를 위해 조금 더 만듭니다.
import time
import subprocess
def gitAdd(fileName, repoDir):
cmd = 'git add ' + fileName
pipe = subprocess.Popen(cmd, shell=True, cwd=repoDir,stdout = subprocess.PIPE,stderr = subprocess.PIPE )
(out, error) = pipe.communicate()
print out,error
pipe.wait()
return
def gitCommit(commitMessage, repoDir):
cmd = 'git commit -am "%s"'%commitMessage
pipe = subprocess.Popen(cmd, shell=True, cwd=repoDir,stdout = subprocess.PIPE,stderr = subprocess.PIPE )
(out, error) = pipe.communicate()
print out,error
pipe.wait()
return
def gitPush(repoDir):
cmd = 'git push '
pipe = subprocess.Popen(cmd, shell=True, cwd=repoDir,stdout = subprocess.PIPE,stderr = subprocess.PIPE )
(out, error) = pipe.communicate()
pipe.wait()
return
temp=time.localtime(time.time())
uploaddate= str(temp[0])+'_'+str(temp[1])+'_'+str(temp[2])+'_'+str(temp[3])+'_'+str(temp[4])
repoDir='d:\\c_Billy\\vfat\\Programming\\Projector\\billyccm' # your git repository , windows your need to use double backslash for right directory.
gitAdd('.',repoDir )
gitCommit(uploaddate, repoDir)
gitPush(repoDir)
다음은 "git status"의 빠른 구현입니다.
import os
import string
from subprocess import *
repoDir = '/Users/foo/project'
def command(x):
return str(Popen(x.split(' '), stdout=PIPE).communicate()[0])
def rm_empty(L): return [l for l in L if (l and l!="")]
def getUntracked():
os.chdir(repoDir)
status = command("git status")
if "# Untracked files:" in status:
untf = status.split("# Untracked files:")[1][1:].split("\n")
return rm_empty([x[2:] for x in untf if string.strip(x) != "#" and x.startswith("#\t")])
else:
return []
def getNew():
os.chdir(repoDir)
status = command("git status").split("\n")
return [x[14:] for x in status if x.startswith("#\tnew file: ")]
def getModified():
os.chdir(repoDir)
status = command("git status").split("\n")
return [x[14:] for x in status if x.startswith("#\tmodified: ")]
print("Untracked:")
print( getUntracked() )
print("New:")
print( getNew() )
print("Modified:")
print( getModified() )
StGit의 Git 상호작용 라이브러리 부분은 사실 꽤 좋습니다.그러나 별도의 패키지로 분리되는 것은 아니지만 이자가 충분하다면 수정할 수 있을 것이라고 확신합니다.
커밋, 트리 등을 표현하고 새 커밋 및 트리를 생성하기 위한 매우 멋진 추상화를 가지고 있습니다.
참고로, 앞서 언급한 Git Python 라이브러리 중 어떤 것도 "Git status"에 해당하는 것으로 보이지 않습니다. 하위 프로세스를 통해 나머지 Git 명령을 처리하는 것이 매우 쉽기 때문에 제가 원하는 유일한 것입니다.
언급URL : https://stackoverflow.com/questions/1456269/python-git-module-experiences
'programing' 카테고리의 다른 글
| Ruby에서 시스템() 호출의 출력을 가져오는 중 (0) | 2023.07.17 |
|---|---|
| 오라클 데이터베이스가 자동 커밋으로 설정되어 있는지 확인하려면 어떻게 해야 합니까? (0) | 2023.07.17 |
| 파이썬으로 URL을 요청하고 리디렉션을 따르지 않는 쉬운 방법이 있습니까? (0) | 2023.07.17 |
| VBA 매크로가 32000행 후 충돌합니다. (0) | 2023.07.17 |
| 응답을 호출할 때 "HTTP 헤더가 전송된 후 리디렉션할 수 없습니다"가 표시되는 이유는 무엇입니까?리디렉션()? (0) | 2023.07.17 |