GitPython脚本clone报错目录已存在非空,如何实现每日仓库数据更新?
解决方案
你遇到的报错是Git的原生规则限制:git clone仅支持克隆到空目录或不存在的目录,目标路径已存在非空目录时就会触发该错误。你只需调整代码逻辑,首次运行时执行克隆,后续运行时直接拉取远程最新内容即可解决问题。
修改后代码示例
from git import Repo, RemoteProgress, InvalidGitRepositoryError from tqdm import tqdm import os import shutil class CloneProgress(RemoteProgress): def update(self, op_code, cur_count, max_count=None, message=''): pbar = tqdm(total=max_count) pbar.update(cur_count) def save(source, directory): # 判断目标路径是否存在 if os.path.exists(directory): try: # 尝试打开路径对应的Git仓库 repo = Repo(directory) # 校验远程仓库地址是否匹配,避免拉错内容 if repo.remote().url != source: raise ValueError(f"目标目录已绑定其他仓库:{repo.remote().url}") # 重置本地分支到和远程master完全一致,丢弃所有本地改动 repo.git.reset('--hard', 'origin/master') # 拉取最新内容 repo.remotes.origin.pull(progress=CloneProgress()) return except InvalidGitRepositoryError: # 路径存在但不是Git仓库,清空后重新克隆 shutil.rmtree(directory) # 路径不存在或已清空,执行克隆 Repo.clone_from(source, directory, branch='master', progress=CloneProgress())
逻辑说明
- 新增了路径校验逻辑,自动区分首次运行和后续运行场景
- 每日重载场景下保留了
--hard重置逻辑,确保本地内容和远程master分支完全一致,无本地残留内容干扰 - 如果不需要丢弃本地修改,删除
repo.git.reset('--hard', 'origin/master')行即可,pull操作会自动合并远程改动到本地 - 若目标路径存在但不是Git仓库(比如之前克隆中断残留了不完整的文件),会自动清空后重新克隆,避免异常
内容的提问来源于stack exchange,提问作者kostya ivanov
相关产品推荐
相关产品推荐

