Collectives™ on Stack Overflow

Find centralized, trusted content and collaborate around the technologies you use most.

Learn more about Collectives

Teams

Q&A for work

Connect and share knowledge within a single location that is structured and easy to search.

Learn more about Teams Looks like there's GitPython ( pypi.python.org/pypi/GitPython , gitorious.org/git-python ) which I don't think has a clone method, but I'll bet you could add one... internally it's going to have to call git clone anyway though. Cascabel Mar 18, 2010 at 19:04 [Dulwich][1] is a pure-Python implementation of Git that does not fork at all. Be aware that it's still under development, so it may be buggy. [1]: samba.org/~jelmer/dulwich Mark Lodato Mar 28, 2010 at 3:50

Using GitPython will give you a good python interface to Git.

For example, after installing it ( pip install gitpython ), for cloning a new repository you can use clone_from function:

from git import Repo
Repo.clone_from(git_url, repo_dir)

See the GitPython Tutorial for examples on using the Repo object.

Note: GitPython requires git being installed on the system, and accessible via system's PATH.

You can provide the authentication in the git_url, depending on from where you clone the repo, you may need to put the username and password/pat in there. See here for Github – LemurPwned Jan 17, 2020 at 14:51

There is GitPython. Haven’t heard of it before and internally, it relies on having the git executables somewhere; additionally, they might have plenty of bugs. But it could be worth a try.

How to clone:

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

(It’s not nice and I don’t know if it is the supported way to do it, but it worked.)

Oh, my bad, I missed that possibility. Mike, just remember, internally this is just calling the git executable anyway; it's just managing it a little for you. – Cascabel Mar 18, 2010 at 19:19 I looked at gitorious.. just overlooked the clone option since its not documented at all.. but I expected whatever i used to to some sort of process command.. this works thanks! – Mike Mar 18, 2010 at 19:29 This module was really helpful, thank you. Can you help me how to pull the master branch of already cloned repo using this module – The Gr8 Adakron Mar 9, 2019 at 13:41

My solution is very simple and straight forward. It doesn't even need the manual entry of passphrase/password.

Here is my complete code:

import sys
import os
path  = "/path/to/store/your/cloned/project" 
clone = "git clone gitolite@<server_ip>:/your/project/name.git" 
os.system("sshpass -p your_password ssh user_name@your_localhost")
os.chdir(path) # Specifying the path where the cloned project needs to be copied
os.system(clone) # Cloning
                Works great, however if you use other relative paths in your project, you may want to remember the true working directory os.getcwd() before changing it with os.chdir(...) and reset it back afterwards.
– Maximosaic
                Oct 24, 2018 at 12:03
                @Maximosaic this can be avoided by using git clone <repo_url> <target_path>. No need to use chdir
– Lahiru Chandima
                Dec 1, 2020 at 7:00
                In addition to the other potential caveats already mentioned, if you want to run a shell command (in that case git cli) better go if favour of subprocess over os as os.system will be depreceted, cheers
– theraulpareja
                Feb 1, 2021 at 17:38

and later, code it :)

from git.repo.base import Repo
Repo.clone_from("https://github.com/*****", "folderToSave")

I hope this helps you

class CloneProgress(RemoteProgress): def update(self, op_code, cur_count, max_count=None, message=''): if message: print(message) print('Cloning into %s' % git_root) git.Repo.clone_from('https://github.com/your-repo', '/your/repo/dir', branch='master', progress=CloneProgress()) Here are some guidelines for How do I write a good answer?. This provided answer may be correct, but it could benefit from an explanation. Code only answers are not considered "good" answers. From review. – Trenton McKinney Sep 24, 2019 at 0:51

Github's libgit2 binding, pygit2 provides a one-liner cloning a remote directory:

clone_repository(url, path, 
    bare=False, repository=None, remote=None, checkout_branch=None, callbacks=None)
                Would this require installing libgit2 separately, or does it come bundled together with pygit2?
– norok2
                Aug 5, 2022 at 14:55

Pretty simple method is to just pass the creds in the url, can be slightly suspect though - use with caution.

import os
def getRepo(repo_url, login_object):
  Clones the passed repo to my staging dir
  path_append = r"stage\repo" # Can set this as an arg 
  os.chdir(path_append)
  repo_moddedURL = 'https://' + login_object['username'] + ':' + login_object['password'] + '@github.com/UserName/RepoName.git'
  os.system('git clone '+ repo_moddedURL)
  print('Cloned!')
if __name__ == '__main__':
    getRepo('https://github.com/UserName/RepoYouWant.git', {'username': 'userName', 'password': 'passWord'})
# create local Repo/Folder
UPLOAD_FOLDER = "LocalPath/Folder"
if not os.path.exists(UPLOAD_FOLDER):
  os.makedirs(UPLOAD_FOLDER)
  print(UPLOAD_FOLDER)
new_path = os.path.join(UPLOADFOLDER)
DIR_NAME = new_path
REMOTE_URL = "GitURL"  # if you already connected with server you dont need to give 
any credential
# REMOTE_URL looks "git@github.com:path of Repo"
# code for clone
class git_operation_clone():
    def __init__(self):
        self.DIR_NAME = DIR_NAME
        self.REMOTE_URL = REMOTE_URL
    def git_clone(self):
        if os.path.isdir(DIR_NAME):
            shutil.rmtree(DIR_NAME)
        os.mkdir(DIR_NAME)
        repo = git.Repo.init(DIR_NAME)
        origin = repo.create_remote('origin', REMOTE_URL)
        origin.fetch()
        origin.pull(origin.refs[0].remote_head)
  except Exception as e:
      print(str(e))
# code for push
class git_operation_push():
  def git_push_file(self):
        repo = Repo(DIR_NAME)
        commit_message = 'work in progress'
        # repo.index.add(u=True)
        repo.git.add('--all')
        repo.index.commit(commit_message)
        origin = repo.remote('origin')
        origin.push('master')
        repo.git.add(update=True)
        print("repo push succesfully")
    except Exception as e:
        print(str(e))
if __name__ == '__main__':
   a = git_operation_push()
   git_operation_push.git_push_file('')
   git_operation_clone()
   git_operation_clone.git_clone('')
destination_path  = "destination/path/where/project/to/be/cloned"
clone_command = "git clone https://your.git.servername/git-folder/repo-name.git" 
clone_with_path = clone_command  +" "+ destination_path
os.system(clone_with_path)

Perk: It will create a destination folder if it doesn't exist.

Thanks for contributing an answer to Stack Overflow!

  • Please be sure to answer the question. Provide details and share your research!

But avoid

  • Asking for help, clarification, or responding to other answers.
  • Making statements based on opinion; back them up with references or personal experience.

To learn more, see our tips on writing great answers.

Is there a way to clone(or download) private remote repositories via python with git username-password? See more linked questions