如何删除单个git仓库克隆,而不使用rm -rf命令?

6
使用rm -r命令无法删除git仓库,因为.git目录包含许多受写保护的文件。作为所有者,我有权限删除这些文件,但一个一个确认它们是不可行的。
现在,通过将-f标志添加到rm命令中,可以一次性完成所有操作,但这意味着我失去了对受保护内容的保护,例如本地分支尚未推送的其他git仓库。
但似乎这是唯一的方法,所以最近我经常使用rm -rf命令,但我总是感到不安。是否有更好的方法来摆脱单个仓库克隆?它不会问及成千上万个单独的文件,但如果我尝试删除除单个仓库之外的任何内容,它会失败。理想情况下,它还应该检查我要删除的repo是否有最新的远程更新,然后再进行实际删除。
我不太清楚这个问题有什么不清楚的地方...它就是这样:
如何使用命令删除包括所有内容的存储库,而不会删除任何其他具有写保护文件的目录?

不确定是否已经存在这样的东西,但是一个shell脚本应该足够了吧? - Oliver Charlesworth
1
这是相当多的逻辑要求:“如果一个命令返回特定的退出代码,但不删除由特定文件(.git)标识的某些子目录,则删除一个目录”。听起来像是你需要自己编写代码。我承认,我没有看到你试图解决的问题:在什么情况下,您正在删除存储库,并且不确定它们是否包含其他存储库,您可能不想删除? - larsks
@larsks 我不会删除我不确定是否包含其他存储库的存储库,但我会删除与其他我想保留的东西位于同一目录(或至少是相同的Unix树)中的存储库。因此,虽然我永远不会输错任何路径,但确实不存在问题,但我更喜欢不让自己更容易地踩到自己的脚。 - leftaroundabout
2个回答

6
首先,您需要收集所有的垃圾对象:
git gc --prune=all

现在只剩下一个只读的打包文件和相应的只读的打包索引。

cd ..
rm -r repo

现在只需要确认两次而不是成千上万次了。

但是这并不能防止删除已签出的子模块。


4
你可以在你的.bashrc中创建一个小的bash函数: ```bash 您可以在.bashrc文件中创建一个小型的Bash函数: ```
function rmgit() {
    # Recursively apply write permissions to files in the .git folder
    chmod -R +w "${1}/.git"
    # Remove the clone
    rm -r "${1}"
}

打开一个新的Shell终端,你现在应该能够:

rmgit /path/to/clone

可以了。这是我要用的,因为它能够完成任务,并且比“git gc --prune=all”快得多。我仍然接受了其他答案,因为它感觉更加“正确”和安全。 - leftaroundabout

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