2010-03-18 5 views
36

Existe-t-il un moyen Python sans utiliser de sous-processus pour cloner un dépôt git? Je suis prêt à utiliser n'importe quel type de modules que vous recommandez.Python façon de cloner un dépôt git

+3

gitpy, je pense que ce serait appelé – SilentGhost

+0

@SilentGhost: vous voulez dire * ce * gitpy? http://github.com/vmalloc/gitpy de http://www.ryaari.com/blog/?p=9 – VonC

+0

On dirait qu'il y a GitPython (http://pypi.python.org/pypi/GitPython, http: //gitorious.org/git-python) que je ne pense pas avoir une méthode de clonage, mais je parie que vous pourriez en ajouter un ... en interne, il faudra quand même appeler 'git clone'. – Cascabel

Répondre

19

Il y a http://gitorious.org/git-python/. Je n'ai jamais entendu parler de ça auparavant et en interne, ça dépend d'avoir les exécutables git quelque part; En outre, ils peuvent avoir beaucoup de bugs. Mais ça pourrait valoir le coup d'essayer.

Comment cloner:

import git 
git.Git("/your/directory/to/clone").clone("git://gitorious.org/git-python/mainline.git") 

(. Ce n'est pas agréable et je ne sais pas si c'est le moyen pris en charge de le faire, mais cela a fonctionné)

+0

Je ne crois pas à ces clones. – Cascabel

+0

C'est le cas. Mais c'est un peu compliqué. – Debilski

+1

Oh, ma mauvaise, j'ai raté cette possibilité. Mike, rappelez-vous, en interne, cela appelle simplement le git exécutable de toute façon; c'est juste gérer ça un peu pour toi. – Cascabel

1

Avec la pointe Dulwich vous devriez être capable de faire:

from dulwich.repo import Repo 
Repo("/path/to/source").clone("/path/to/target") 

C'est encore très basique - il copie à travers les objets et les refs, mais il ne crée pas encore le contenu de l'arbre de travail si vous créez un référentiel non-nu. L'utilisation de GitPython vous donnera une bonne interface python à Git.

60

Par exemple, après l'avoir installé (pip install gitpython), pour le clonage d'un nouveau référentiel, vous pouvez utiliser la fonction clone_from:

from git import Repo 

Repo.clone_from(git_url, repo_dir) 

Note: GitPython nécessite git être installé sur le système, et accessible via le PATH du système .

+1

N'a pas fonctionné pour moi parce que "pip install gitpython" n'a pas installé la dernière version, à la place installé 1.7 qui n'a pas clone_from. Désolé pour le downvote, mon b :( – blented

+4

@blented Merci d'avoir mentionné, mais malheureusement, il est dû à la version GitPython weired (le 1.7 est trop vieux) Quoi qu'il en soit, je m'attends à ce que quiconque voit cette question pour être en mesure de découvrir simplement faites 'pip installer gitpython == 0.3.2.RC1' à la place! –

+1

@AmirAliAkbari 0.3.2 RC1 est maintenant le candidat d'installation par défaut. – Kasisnu

4

Github liaison de libgit2, pygit2 fournit un clonage en une ligne un répertoire distant:

clone_repository(url, path, 
    bare=False, repository=None, remote=None, checkout_branch=None, callbacks=None) 
4

Ma solution est très simple et directe. Il n'a même pas besoin de l'entrée manuelle de paraphrase/mot de passe.

Voici mon code complet:

import os 
import sys 

path  = "/path/to/store/your/cloned/project" 
clone  = "git clone [email protected]:/your/project/name.git" 

os.system("sshpass -p your_password ssh [email protected]_localhost") 
os.chdir(path) # Specifying the path where the cloned project has to be copied 
os.system(clone) # Cloning 

print "\n CLONED SUCCESSFULLY.! \n" 
Questions connexes