Git push через GitPython

У меня есть этот код в Python (используя «import git»):

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

Теперь я хочу нажать эту фиксацию. Я много пробовал, но безуспешно. Команда Python должна быть похожа на эту команду Bash:

git push origin HEAD:refs/for/master

person amigo    schedule 24.01.2017    source источник


Ответы (5)


Ниже приведен код для git add, git commit, а затем git push с использованием GitPython.

Установите GitPython, используя 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()
person BlackBeard    schedule 09.01.2019
comment
Есть ли способ ввести пароль через python? - person nerdguy; 10.12.2019
comment
@nerdguy СОВЕТЫ: ​​поищите в git ssh. сделает жизнь намного проще и безопаснее. нет необходимости использовать пароль и http :) - person aimme; 25.04.2020
comment
настроить git с помощью настройки среды git ssh для работы из командной строки без ввода пользователем имени пользователя/пароля. держите пароли вне кода. - person CodingMatters; 17.05.2020
comment
Я получаю пустые толчки в репо? - person James; 09.09.2020
comment
API для git pull говорит kwargs – Additional arguments to be passed to git-pull. Итак, могу ли я напрямую использовать repo.git.pull() без использования remote()< /a> указать the remote ветку? Вижу ответ Шагаджи, который мне непонятен по позиционным параметрам. Я не вижу этого в документах. - person Timo; 17.07.2021

Вы можете попробовать следующее. Возможно, это решит вашу проблему...

repo.git.pull('origin', new_branch)
repo.git.push('origin', new_branch)
person Shahaji    schedule 25.04.2017

Этого можно добиться с помощью Index (немного задокументировано здесь) вот так:


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()
person Marc    schedule 06.07.2019

Глядя на страницу документации gitpython http://gitpython.readthedocs.io/en/stable/tutorial.html. Вы должны определить удаленное репо с чем-то вроде origin = repo.create_remote('origin', repo.remotes.origin.url)

затем origin.pull()

Я бы посмотрел весь пример в документации в разделе "Обработка пультов"

Вот полный пример из документации

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
person Kabard    schedule 24.01.2017
comment
Спасибо, я видел этот пример, но у меня он все равно не работает... Ошибка в первой строке origin = repo.create_remote('origin', repo.remotes.origin.url): git remote add origin ssh:........ вернул статус выхода 128: фатальный: удаленный источник уже существует. Какие-либо предложения? - person amigo; 25.01.2017
comment
если кто-то может помочь, я буду очень признателен:) - person amigo; 23.02.2017

У меня такая же проблема. Я решил это, позвонив

repo.git.push("origin", "HEAD:refs/for/master")
person imolit    schedule 12.06.2017