Как удалить каталог с папкой .git в Python - PullRequest
1 голос
/ 17 апреля 2019

Я пытаюсь создать программу для резервного копирования. Он работает путем копирования проекта в резервную папку. Перед копированием он делает некоторые проверки. Я проверяю, было ли ранее создано резервное копирование папки, если это необходимо, нужно скопировать эту папку перед копированием новой резервной копии.

Когда я делаю резервные копии проектов, у которых нет папки .git, все работает нормально. Как только в каталоге проекта есть папка .git, она ломается. Это не удалит папку .git, которая портит остальную часть программы. Я не могу найти способ удалить папку .git.

Мой код: https://pastebin.com/jyGhQDB5

def EXTERNAL_BACKUP():
    # Loaction of External backup, to check if the language folder exists
    EXT_BACKUP_LANG_DIR = 'D:/2019/' + BACKUP_LANGUAGE

    if os.path.exists(EXT_BACKUP_LANG_DIR):
        # Check if project has a backup saved already
        if os.path.exists(EXTERNAL_LOCATION):
            print('\nFolder has already been backed up, previously. Proceeding to zip previous folder before copying new backup.')
            # Check for any old zip files of the project
            os.chdir(EXT_BACKUP_LANG_DIR)
            for file in glob.glob(PROJECT_NAME + '.zip'):
                # All zips with the name of the current project backup will be deleted
                os.remove(EXT_BACKUP_LANG_DIR, file)
                if os.path.exists(EXT_BACKUP_LANG_DIR + file):
                    os.rmdir(EXT_BACKUP_LANG_DIR + file)

            # Call function to zip previous backup
            MAKE_ARCHIVE(PROJECT_NAME + '--OLD', EXTERNAL_LOCATION)
            # Print to console when the zipping has finished
            print(PROJECT_NAME +
                  ' has been zipped. Proceeding to delete non-zipped folder.')
            # Delete the non-zipped folder before copying new backup
            for the_file in os.listdir(EXTERNAL_LOCATION):
                file_path = os.path.join(EXTERNAL_LOCATION, the_file)
                try:
                    if os.path.isfile(file_path):
                        os.unlink(file_path)
                    elif os.path.isdir(file_path):
                        shutil.rmtree(file_path)
                except Exception as e:
                    print(e)

            print('Non-zipped folder has been deleted. Proceeding to backup.')
            shutil.copytree(SOURCE_DIRECTORY, EXTERNAL_LOCATION)
            print('Successfully backed up.\n')
        else:
            # Copy project folder as normal
            print('\nBackup to external has begun.')
            shutil.copytree(SOURCE_DIRECTORY, EXTERNAL_LOCATION)
            print('Backup to the external has been completed.')
    elif not os.path.exists(EXT_BACKUP_LANG_DIR):
        # Backup language does not exist, so create the fodler before performing backup
        os.mkdir(BACKUP_LANGUAGE)
        print('\n' + BACKUP_LANGUAGE + ' not found. Created a new folder called '
              + BACKUP_LANGUAGE + '. Proceeding to backup files to external HDD.')
        shutil.copytree(SOURCE_DIRECTORY, EXTERNAL_LOCATION)
        print('Backup to the external has been completed.')
    return

Я уже некоторое время пытаюсь найти ответ в Google. Ответы на этот вопрос не сработали. Как удалить каталог, содержащий .git в python

1 Ответ

0 голосов
/ 17 апреля 2019

Вот что я придумал. Попробуйте и, надеюсь, это сработает. Предполагается, что вы находитесь на Windows.

Примечание: метод on_rm_error из этого поста .

import os
import stat
import shutil
from subprocess import call

dir = r'C:\Users\...\...\...'

def on_rm_error(func, path, exc_info):
    #from: /2822237/kak-udalit-dostupnyi-tolko-dlya-chteniya-attrib-katalog-s-python-v-windows
    os.chmod(path, stat.S_IWRITE)
    os.unlink(path)


for i in os.listdir(dir):
    if i.endswith('git'):
        tmp = os.path.join(dir, i)
        # We want to unhide the .git folder before unlinking it.
        while True:
            call(['attrib', '-H', tmp])
            break
        shutil.rmtree(tmp, onerror=on_rm_error)
...