25

I have this code in Python (using "import git"):

repo = git.Repo("my_repository")
repo.git.add("bla.txt")
repo.git.commit("my commit description")

Now I want to push this commit. I've tried a lot with no success. The Python command should be similar to this Bash command:

git push origin HEAD:refs/for/master

5 Answers 5

38

Following is the code to git add, git commit and then git push using GitPython.

Install GitPython using pip install gitpython.

from git import Repo

PATH_OF_GIT_REPO = r'path\to\your\project\folder\.git'  # make sure .git folder is properly configured
COMMIT_MESSAGE = 'comment from python script'

def git_push():
    try:
        repo = Repo(PATH_OF_GIT_REPO)
        repo.git.add(update=True)
        repo.index.commit(COMMIT_MESSAGE)
        origin = repo.remote(name='origin')
        origin.push()
    except:
        print('Some error occured while pushing the code')    

git_push()
Sign up to request clarification or add additional context in comments.

5 Comments

Is there a way to enter the password via python?
@nerdguy TIPS: do a little search on git ssh. will make life a lot easier and secure. no need to use password and http :)
configure git using git ssh environment setup to work from command line without user inputting username / password. keep passwords out of code.
I get empty pushes to the repo?
the api for git pull says kwargs – Additional arguments to be passed to git-pull. So can I directly use repo.git.pull() without using remote() to specify the remote branch? I see Shaghaji answer, that is not clear to me regarding the positional parameters. I cannot see it in the doks.
6

You can try the following. It may have your problem solved...

repo.git.pull('origin', new_branch)
repo.git.push('origin', new_branch)

Comments

4

This can be achieved by using Index (documented a little bit here) like so:


from git import Repo
repo = Repo('path/to/git/repo')  # if repo is CWD just do '.'

repo.index.add(['bla.txt'])
repo.index.commit('my commit description')
origin = repo.remote('origin')
origin.push()

Comments

1

Looking at the documentation page of gitpython http://gitpython.readthedocs.io/en/stable/tutorial.html. You have to define a remote repo with something like origin = repo.create_remote('origin', repo.remotes.origin.url)

then origin.pull()

I would look at the whole example in the documentation in the section "Handling Remotes"

Here is the full example from the documentation

empty_repo = git.Repo.init(osp.join(rw_dir, 'empty'))
origin = empty_repo.create_remote('origin', repo.remotes.origin.url)
assert origin.exists()
assert origin == empty_repo.remotes.origin == empty_repo.remotes['origin']
origin.fetch()                  # assure we actually have data. fetch() returns useful information
# Setup a local tracking branch of a remote branch
empty_repo.create_head('master', origin.refs.master)  # create local branch "master" from remote "master"
empty_repo.heads.master.set_tracking_branch(origin.refs.master)  # set local "master" to track remote "master
empty_repo.heads.master.checkout()  # checkout local "master" to working tree
# Three above commands in one:
empty_repo.create_head('master', origin.refs.master).set_tracking_branch(origin.refs.master).checkout()
# rename remotes
origin.rename('new_origin')
# push and pull behaves similarly to `git push|pull`
origin.pull()
origin.push()
# assert not empty_repo.delete_remote(origin).exists()     # create and delete remotes

3 Comments

Thanks, I've seen this example but it still didn't work for me... There is an error in the first line origin = repo.create_remote('origin', repo.remotes.origin.url): "git remote add origin ssh:........ returned exit status 128: fatal: remote origin already exists. Any suggestions?
if someone can help I'll so appreciate it :)
This example makes no sense. repo.create_remote('origin', repo.remotes.origin.url) is creating the 'origin' remote by referencing the url of the 'origin' remote??? If repo.remotes.origin is not None then you already have the origin remote and can just simply do repo.remotes.origin.push()
1

I had the same problem. I solved it by calling

repo.git.push("origin", "HEAD:refs/for/master")

Comments

Your Answer

By clicking “Post Your Answer”, you agree to our terms of service and acknowledge you have read our privacy policy.

Start asking to get answers

Find the answer to your question by asking.

Ask question

Explore related questions

See similar questions with these tags.