代码之家  ›  专栏  ›  技术社区  ›  azev

GitPython:从远程拉/签出,放弃本地更改

  •  0
  • azev  · 技术社区  · 7 年前

    为了将文件部署到一些目标(Windows)计算机,我想创建一个Python模块,可以提供必要的参数。

    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 回复  |  直到 7 年前
        1
  •  3
  •   Adrien Blanquer Alex    7 年前

    如果回购存在,并且您希望 放弃所有本地更改 从远程获取最新提交

    # 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()
    

    使用这些命令,您不必再次删除repo和克隆。

    你可以查一下文件 here

        2
  •  1
  •   azev    7 年前

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

    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')
    
        3
  •  1
  •   mark sabido    3 年前

    对于那些希望正确使用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)