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
相关推荐
zh1570236 小时前
mysql如何给用户分配全局权限_合理使用GLOBAL权限层级
jvm·数据库·python
2303_821287386 小时前
HTML怎么配合JavaScript交互_HTML DOM操作入门【指南】
jvm·数据库·python
m0_631529826 小时前
SQL如何简化长SQL子查询结构_利用CTE公用表表达式优化
jvm·数据库·python
小冷爱学习!6 小时前
Apache Shiro 1.2.4 反序列化漏洞Shiro-550(CVE-2016-4437)
服务器·网络·python·安全·网络安全·apache
m0_740352426 小时前
mysql安装完成后如何配置慢查询阈值_mysql日志监控方法
jvm·数据库·python
m0_740796366 小时前
如何查找SQL中最常见的元素_结合GROUP BY与COUNT
jvm·数据库·python
wang3zc6 小时前
HTML怎么标注成就连续打卡中断_HTML“断连,重新开始”提示【方法】
jvm·数据库·python
_376271536 小时前
如何正确验证 GOPATH 和 PATH 环境变量是否生效
jvm·数据库·python
m0_736439307 小时前
如何在phpMyAdmin中处理权限更改不生效_FLUSH PRIVILEGES命令执行
jvm·数据库·python
2401_824697667 小时前
优化文本分类中堆叠模型的网格搜索性能:避免训练卡顿的实用指南
jvm·数据库·python