GitPython:Pull/Checkout 来自远程,放弃本地更改

GitPython: Pull/Checkout from remote, discard local changes

为了将文件部署到某些目标 (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 ----")

如果 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 了解更多信息。

这是解决我问题的代码。

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

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

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')

对于那些更愿意使用 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)