如何在Windows上使用Python删除Git代码库

7
如标题所述,我需要使用Python删除一个Git存储库。我看到了其他关于这个话题的问题,但是没有任何解决方案适用于我。
我的工作: 我需要使用GitPython下载一个存储库,并检查一些无关紧要的事情。完成该过程后,我需要删除存储库以为使用我的脚本的人节省空间。
问题: 克隆Git存储库时,会创建一个.git文件。这个文件在Windows中是隐藏的,并且我使用的模块没有权限删除.git文件夹中的任何文件。
我尝试了什么:
import shutil
shutil.rmtree('./cloned_repo')

PermissionError: [WinError 5] Access is denied:

任何关于这个问题的帮助将不胜感激。

你尝试使用 os.system('rm -r $gitfolder') 吗? - programandoconro
我现在已经执行了这个命令。这个命令需要用户输入(它正在询问我是否真的想要删除受写保护的文件)。同时,它在给我一个奇怪的堆栈跟踪的同时也未能删除这些文件。 - Kuratorn
请尝试在命令中添加“-y”,以查看是否可以通过此方式避免用户输入。os.system('rm -r $ gitfolder-y') - programandoconro
请尝试使用 os.remove('文件夹路径')。 - programandoconro
这个回答解决了你的问题吗?在Python中删除目录 - tejasvi88
4个回答

6

Git有一些只读文件。您需要先更改权限:

import subprocess
import shutil
import os
import stat
from os import path
for root, dirs, files in os.walk("./cloned_repo"):  
    for dir in dirs:
        os.chmod(path.join(root, dir), stat.S_IRWXU)
    for file in files:
        os.chmod(path.join(root, file), stat.S_IRWXU)
shutil.rmtree('./cloned_repo')

1
他在Windows系统中,这是标题。 - Miguel
s_irwxu 的意思是 inode 读 写 执行 ?? - Timo

3
如上所述,这是因为Git的许多文件是只读的,在Windows上Python无法优雅地删除。GitPython模块有一个实用程序函数可以解决这个问题:git.util.rmtree 像这样调用函数应该可以解决您的问题:
from git import rmtree
rmtree('./cloned_repo')

您还可以在此处查看其源代码——截至2020年12月,它与上面的答案相似。


这实际上是我个人认为最好、最干净的解决方案。在使用Python中的git时,不需要额外的导入,也不需要任何循环。 - Carl Philipp

0

我尝试了上面所有的建议,但都没有起作用。

我正在使用GitPython模块来处理我的git仓库,但我不确定我是否正确地处理了任何打开的连接。话虽如此,我已经找到了一种方法来终止所有git会话,这“解决了”我的问题。(虽然这是一个不太优雅的解决方案)

import os
folder = "path/to/root"
git_repo = git.Repo(folder)
# do something with gitrepo

os.system(f'taskkill /IM "git.exe" /F')

这不是一个好的解决方案,因为您可能有其他未关闭的git会话。一种方法是确保您关闭git会话,通过关闭它。

git_repo = git.Repo(folder)
#do something with gitrepo
git_repo.close()

虽然更好的方法是使用上下文管理器,比如 'with'

import git
with git.Repo(folder) as git_repo:
   # do something with gitrepo

上下文管理器使得管理Git仓库更加容易,减少了在会话中打开仓库的可能性,从而减少只读访问错误的可能性。


0
如果您在Python 3.8+中使用tempfile.TemporaryDirectory,这将起作用。Git和Windows的特定问题被认为是Python中的错误,并在3.8中得到了解决。
对于<=3.7,您需要参考其他答案或Python问题中链接的一些解决方法。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接