167 votes

Expériences du module Python Git?

Quelles sont les expériences des gens avec tout le Git modules de Python? (Je sais de GitPython, PyGit, et Dulwich - n'hésitez pas à mentionner d'autres si vous en connaissez d'eux.)

Je suis en train d'écrire un programme qui devra interagir (ajouter, supprimer, valider) avec un dépôt Git, mais n'ont aucune expérience avec Git, donc, une des choses que je suis à la recherche de facilité d'utilisation et de compréhension en ce qui concerne le dépôt Git.

Les autres choses que je suis principalement intéressé par sont de la maturité et de l'exhaustivité de la bibliothèque, une logique de l'absence de bugs, la poursuite du développement et de la serviabilité, de la documentation et des développeurs.

Si vous pensez à quelque chose d'autre que je pourrais avoir envie/besoin de savoir, n'hésitez pas à le mentionner.

117voto

underrun Points 2389

Alors que cette question a été posée il y a longtemps et je ne sais pas l'état des bibliothèques, à ce point, il convient de mentionner pour les chercheurs qui GitPython fait un bon travail d'abstraction les outils de ligne de commande de sorte que vous n'avez pas besoin d'utiliser des sous-processus. Il y a certains construite dans les abstractions que vous pouvez utiliser, mais pour tout le reste, vous pouvez faire des choses comme:

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()

Tout le reste dans GitPython seulement la rend plus facile à naviguer. Je suis assez satisfait avec cette bibliothèque et de savoir qu'il est un wrapper sur le sous-jacent git outils.

Mise à JOUR: j'ai passé à l'aide de la sh module pour ne pas simplement git, mais la plupart des utilitaires de ligne de commande j'ai besoin d'en python. Pour répliquer ci-dessus, je voudrais faire ceci à la place:

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()

74voto

PTBNL Points 2344

J'ai pensé que je pourrais répondre à ma propre question, car je vais prendre un chemin différent que celui proposé dans les réponses. Néanmoins, merci à ceux qui ont répondu.

Tout d'abord, un bref résumé de mes expériences avec GitPython, PyGit, et Dulwich:

  • GitPython: Après le téléchargement, j'ai eu ce importés et l'objet initialisé. Cependant, en essayant de faire ce qui était proposé dans le tutoriel conduit à des erreurs. Manque de plus de la documentation, je me suis tourné ailleurs.
  • PyGit: Ce ne serait même pas d'importation, et que j'ai pu trouver aucune documentation.
  • Dulwich: Semble être le plus prometteur (au moins pour ce que je voulais et a vu). J'ai fait quelques progrès avec elle, plus qu'avec GitPython, depuis son oeuf vient avec source Python. Cependant, après un certain temps, j'ai décidé, il peut être plus facile d'essayer ce que j'ai fait.

Aussi, StGit semble intéressant, mais j'aurais besoin de la fonctionnalité extrait dans un module séparé et ne veulent pas attendre que cela se produise maintenant.

En (beaucoup) moins de temps que j'ai passé à essayer d'obtenir les trois modules ci-dessus fonctionne, j'ai réussi à obtenir des commandes git de travail via le sous-processus module, par exemple

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')

Ce n'est pas pleinement intégré dans mon programme, mais je ne suis pas d'anticiper un problème, sauf peut-être la vitesse (car je vais être le traitement des centaines ou même des milliers de fichiers à la fois).

Peut-être que je n'ai tout simplement pas la patience pour faire avancer les choses avec Dulwich ou GitPython. Cela dit, j'ai l'espoir de le modules obtiendrez plus de développement et d'être plus utile à bientôt.

30voto

tamale Points 199

Je recommande pygit2 - il utilise les excellentes liaisons libgit2

20voto

Gerald Kaszuba Points 9769

C'est une très vieille question, et en cherchant des bibliothèques Git, j'en ai trouvé une qui a été créée cette année (2013) et qui s'appelle Gittle .

Cela a fonctionné très bien pour moi (où les autres que j'ai essayées étaient squameuses) et semble couvrir la plupart des actions communes.

Quelques exemples du 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()
 

17voto

tonfa Points 8867

Peut-être que cela aide, mais Bazaar et Mercurial utilisent tous deux Dulwich pour leur interopérabilité Git.

Dulwich est probablement différent de l'autre en ce sens qu'il s'agit d'une réimplémentation de git en python. L'autre pourrait être un wrapper autour des commandes de Git (il pourrait donc être plus simple d'utiliser un point de vue de haut niveau: commit / add / delete), cela signifie probablement que leur API est très proche de la ligne de commande de git. acquérir de l'expérience avec Git.

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X