GitPython:从远程拉/退出,丢弃本地更改

时间:2017-07-11 15:56:35

标签: python git gitpython

为了将文件部署到某些目标(Windows)计算机,我想创建一个可以使用必要参数提供的Python模块。 然后,模块应检查输出路径中是否存在指定的repo。

a)如果它不存在:克隆来自远程

的最新提交

b)如果存在:丢弃所有本地更改,从远程提取最新提交

一种方式(至少这对我有用)是删除本地目标文件夹,重新创建它并再次克隆所有内容。

我的代码,仅适用于空目录:

stderr: 'fatal: remote origin already exists.'

import git, os, shutil
#outputfolder there?
if not os.path.exists(MY_outputfolder):
    os.makedirs(MY_outputfolder)
repowrk = git.Repo.init(MY_outputfolder)
wrkr = repowrk.create_remote('origin',MY_REMOTE_URL)
wrkr.fetch()
wrkr.pull(wrkr.refs[0].remote_head)
print("---- DONE ----")

3 个答案:

答案 0 :(得分:0)

如果存在repo且您想放弃所有本地更改,并且从远程提取最新提交,则可以使用以下命令:

# discard any current changes
repo.git.reset('--hard')

# if you need to reset to a specific branch:    
repo.git.reset('--hard','origin/master')

# pull in the changes from from the remote
repo.remotes.origin.pull()

使用这些命令,您不必删除存储库并再次克隆。

您可以查看文档here以获取更多信息。

答案 1 :(得分:0)

这是代码,解决了我的问题。

a。)输出目录包含一个.git文件夹:假设这是一个本地仓库。还原所有本地更改,清除未版本控制的文件

b。)输出目录不包含.git文件夹(或filetree不存在):假设目标目录是脏的或不是本地存储库。删除目标树并将远程目录克隆到指定目标。

outdir_checker = outdir+'\.git'

if os.path.exists(outdir_checker):
    repo_worker = git.Repo.init(outdir)
    repo_worker.git.fetch(remote_url)
    repo_worker.git.reset('--hard')
    repo_worker.git.clean('-fdx')
    print('git dir not created; already existed')
if not os.path.exists(outdir_checker):
    shutil.rmtree(outdir, ignore_errors=True)
    os.makedirs(outdir)
    git.Repo.clone_from(remote_url, outdir)
    print('git dir created')

答案 2 :(得分:0)

对于那些更喜欢正确使用 gitpython 而不是命令行界面的编码版本的人:

# Create a new branch
new_branch = repo.create_head("new_branch")

# Point your head to the new branch. Note that no working tree changes have taken place yet
repo.head.reference=new_branch 

# Perform a reset. Note that index and working_tree must be set to True
# to ensure that the staging area and working tree are overwritten
repo.head.reset(index=True, working_tree=True)