Python Git Module experiences? [закрытый]
каковы впечатления людей от любого из модулей Git для Python? (Я знаю о Гитпифоне, Пигите и Дулвиче - не стесняйтесь упоминать других, если вы знаете о них.)
Я пишу программу, которая должна будет взаимодействовать (добавлять, удалять, фиксировать) с репозиторием Git, но не имеет опыта работы с Git, поэтому одна из вещей, которые я ищу, - это простота использования/понимания в отношении Git.
другие вещи, которые меня в первую очередь интересуют, - это зрелость и полнота библиотеки, разумное отсутствие багов, продолжение разработки, а также полезность документации и разработчиков.
Если вы думаете о чем-то еще, что я мог бы хотеть/нужно знать, пожалуйста, не стесняйтесь упомянуть об этом.
11 ответов:
хотя этот вопрос был задан некоторое время назад, и я не знаю состояние библиотек на тот момент, стоит упомянуть для поисковиков, что 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.
обновление: я переключился на использование модуля sh не только для git, но и для большинства утилит командной строки, которые мне нужны в python. Чтобы повторить выше, я бы сделал это вместо этого:
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()
Я думал, что отвечу на свой собственный вопрос, так как я беру другой путь, чем предложено в ответах. Тем не менее, спасибо тем, кто ответил.
во-первых, краткий обзор моего опыта с GitPython, PyGit, и Далвич:
- GitPython: после загрузки я получил этот импортированный и инициализированный соответствующий объект. Однако попытка сделать то, что было предложено в учебнике, привела к ошибкам. Отсутствие документации, я повернулся в другую сторону.
- PyGit: это даже не импорт, и я не мог найти никакой документации.
- Далвич: кажется, самый перспективный (по крайней мере, для того, что я хотел и видел). Я сделал некоторый прогресс с ним, больше, чем с GitPython, так как его яйцо поставляется с источником Python. Однако, через некоторое время, я решил, что это может быть просто легче попробовать то, что я сделал.
и 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')Это еще не полностью включено в мою программу, но я не ожидаю проблемы, за исключением, может быть, скорости (так как я буду обрабатывать сотни или даже тысячи файлов в времена.)
возможно, я просто не хватает терпения, чтобы получить вещи, идущие с Dulwich или GitPython. Тем не менее, я надеюсь, что модули получат больше развития и будут более полезны в ближайшее время.
Это довольно старый вопрос, и при поиске библиотек 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="[email protected]", 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()
возможно, это помогает, Но Bazaar и Mercurial оба используют dulwich для своей совместимости с Git.
Dulwich, вероятно, отличается от другого в том смысле, что это переопределение git в python. Другой может быть просто оболочкой вокруг команд Git (поэтому его можно было бы проще использовать с точки зрения высокого уровня: commit/add/delete), это, вероятно, означает, что их API очень близок к командной строке git, поэтому вам нужно будет получить опыт работы с Git.
для полноты, http://github.com/alex/pyvcs/ - это слой абстракции для всех систем контроля версий по. Он использует Далвич, но обеспечивает взаимодействие с другими DVCS в это.
обновленный ответ, отражающий измененное время:
GitPython в настоящее время является самым простым в использовании. Он поддерживает обертывание многих команд Git plumbing и имеет подключаемую базу данных объектов (dulwich является одним из них), и если команда не реализована, предоставляет простой api для обстрела в командной строке. Например:
repo = Repo('.') repo.checkout(b='new_branch')Это:
bash$ git checkout -b new_branchDulwich также хорошо, но гораздо ниже уровня. Это своего рода боль, чтобы использовать, потому что это требует работая на объектах git на уровне сантехники и не имеет хорошего фарфора, который вы обычно хотите сделать. Однако, если вы планируете изменить какие-либо части git или использовать git-receive-pack и git-upload-pack, вам нужно использовать dulwich.
ответ PTBNL вполне подходит для меня. Я делаю немного больше для пользователя Windows.
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() )
часть библиотеки взаимодействия git StGit на самом деле довольно хороша. Однако он не разбит как отдельный пакет, но если есть достаточный интерес, я уверен, что это можно исправить.
Он имеет очень хорошие абстракции для представления коммитов, деревьев и т. д., а также для создания новых коммитов и деревьев.
для записи ни одна из вышеупомянутых библиотек Git Python, похоже, не содержит эквивалента "git status", что на самом деле единственное, что я хотел бы, так как работа с остальными командами git через подпроцесс настолько проста.
Comments