I\'m using GitPython but did not find a way to push to repo using username and password. Can anybody send me a working example or give me some pointer about how to do it? W
What worked well for me (worked with GitHub, self hosted BitBucket, most likely will work on GitLab too).
Note, that despite the name, password
here is your access token generated by GitHub and NOT your GitHub password.
from git import Repo
full_local_path = "/path/to/repo/"
username = "your-username"
password = "your-password"
remote = f"https://{username}:{password}@github.com/some-account/some-repo.git"
This will store your credentials in .git/config
, you won't need them later.
Repo.clone_from(remote, full_local_path)
repo = Repo(full_local_path)
repo.git.add("rel/path/to/dir/with/changes/")
repo.index.commit("Some commit message")
As mentioned above, you don't need your credentials, since they are already stored in .git/config
.
repo = Repo(full_local_path)
origin = repo.remote(name="origin")
origin.push()
This is what I used for myself for pulling
#! /usr/bin/env python3
import git
import os
from getpass import getpass
project_dir = os.path.dirname(os.path.abspath(__file__))
os.environ['GIT_ASKPASS'] = os.path.join(project_dir, 'askpass.py')
os.environ['GIT_USERNAME'] = username
os.environ['GIT_PASSWORD'] = getpass()
g = git.cmd.Git('/path/to/some/local/repo')
g.pull()
This is in the same directory as pull.py
and is not limited to Github only.
#!/usr/bin/env python3
#
# Short & sweet script for use with git clone and fetch credentials.
# Requires GIT_USERNAME and GIT_PASSWORD environment variables,
# intended to be called by Git via GIT_ASKPASS.
#
from sys import argv
from os import environ
if 'username' in argv[1].lower():
print(environ['GIT_USERNAME'])
exit()
if 'password' in argv[1].lower():
print(environ['GIT_PASSWORD'])
exit()
exit(1)
I found this working solution:
os.environment['GIT_ASKPASS']= <full path to your script> os.environment['GIT_USERNAME'] = <committer username> os.environment['GIT_PASSWORD'] = <the password>
and anything works fine.