git仓删除当前仓且保留嵌套子仓--类似保留特定文件目录

当前git若有损坏需删除重新下载,但其还含有子仓,不能直接删除整体目录。清理方法如下:

分如下两种场景

1、若是子仓当前没有进行任何操作,即子仓可以临时移动

这种比较简单,分如下几步:

step1:找到全部子仓路径(第2中情况中find_all_sub_git即为查找全部git仓路径的方法);

step2: 创建备份目录;

step3:依次将子仓保留目录层move到备份目录;

step4: 删除当前路径;

step5:将备份目录move当前目录。

2、若是子仓当前正在进行操作,如挑单等,即子仓不可移动

这种需正向找到全部需要删除的目录和文件,依次删除。代码实现如下

python 复制代码
import os
import shutil
from pathlib import Path

def remove_git_dir_and_retain_sub_git(dir_path):
    shutil.rmtree(os.path.join(dir_path, ".git"))  # 需先删除,不然影响递归
    remove_list = []
    get_all_remove_list(dir_path, remove_list)
    for sub_remove in remove_list:
        if os.path.isdir(sub_remove):
            shutil.rmtree(sub_remove)
        else:
            os.remove(sub_remove)
            
def get_all_remove_list(dir_path, remove_list):
    //子仓跳过
    if os.path.exists(os.path.join(dir_path, ".git")): 
        return
    //不包含.git仓的目录可以直接删除
    if not find_all_sub_git(dir_path):
        remove_list.append(dir_path)
        return
    //其它包含.git仓的目录需进行递归
    sub_path_list = os.listdir(dir_path)
    for sub_path in sub_path_list:
        sub_full_path = os.path.join(dir_path, sub_path)
        if os.path.isdir(sub_full_path):
            get_all_remove_list(sub_full_path, remove_list)
        else:
            remove_list.append(sub_full_path)

def find_all_sub_git(dir_path):
    keywords = '**/.git'
    p = Path(base_dir)
    files = p.glob(keywords)
    file_list = list(files)
    file_list = [os.fspath(file_path) for file_path in file_list]
    file_list = [file_path for file_path in file_list if os.path.basename(file_path)]
    return file_list
相关推荐
IvanCodes3 小时前
Python 数据处理(十三):JSON、CSV 与数据序列化
开发语言·python
Patrick在香港4 小时前
Claude 工具调用返回空:8 次失败里只有 1 次状态码不对,其余全带 200
爬虫·python·api·claude·香港
Web3&Basketball4 小时前
CRM Agent 后训练实战:3 倍更少错误
python·架构·大模型·agent·推理
AIFQuant5 小时前
ETF行情API接入踩坑记:从报错到跑通的七个问题
python·金融·区块链·etf·基金
GPU实战笔记7 小时前
云端 Python 开发:JupyterLab 还是 VS Code Remote-SSH?
python·vs code·jupyterlab·remote-ssh·远程开发
狗狗狗狗狗乐啊7 小时前
搭一个 AI 对话工作台 AChat:从 0 到可用的完整记录(一)
python·react.js·ai编程
白猫不黑8 小时前
Python实现简易Web弱口令爆破与防护方案
python·web安全·计算机·网络安全·黑客·信息安全·渗透测试
郑州光合科技余经理8 小时前
同城外卖小程序开发:下单成功后,后台导出能不能对上用户端状态
开发语言·前端·git·后端·uni-app·php·ai编程
kuuailetianzi8 小时前
Python初识:定位、优势与发展历程
python
我命由我123458 小时前
Git 推送报错:error: src refspec main does not match any
运维·git·gitee·github·运维开发·学习方法·版本控制