【问题标题】:How to delete a single git repository clone, without the rm -rf sledgehammer?如何在没有 rm -rf 大锤的情况下删除单个 git 存储库克隆?
【发布时间】:2017-08-24 05:18:33
【问题描述】:

不能简单地使用rm -r 删除git repo,因为.git 目录包含许多写保护文件。我有权限删除这些,因为我是所有者,但无法一一确认。

现在,可以通过将-f 标志添加到rm 来在一个命令中完成所有操作,但这意味着我失去了所有保护措施,无法删除有充分理由受保护的内容。例如,另一个带有我尚未推送的本地分支的 git 存储库。

但这似乎是唯一的方法,所以我发现自己最近经常做rm -rf,但我总是对此感到不安。有没有更好的方法来摆脱单个 repo 克隆,它不会询问数千个单独的文件,但如果我尝试擦除除单个 repo 之外的东西,失败?理想情况下,它还应该在实际删除之前检查我尝试删除的 repo 是否有一些最新的远程。


我不太明白这个问题有什么不清楚的地方……就是这样:

我如何删除包含所有内容的存储库,使用的命令不会同时删除任何其他包含写保护文件的目录?

【问题讨论】:

  • 不确定这样的东西是否已经存在,但大概一个shell脚本就足够了吗?
  • 您所要求的逻辑相当多:“如果命令返回特定退出代码但不返回特定文件标识的某些子目录 (.git),则删除目录”。这听起来像是您需要自己编写代码的东西。我承认;我没有看到您要解决的问题:在什么情况下您要删除存储库并且您不确定它们是否包含您可能不想删除的其他存储库?
  • @larsks 我不会删除我不确定是否包含其他存储库的存储库,但我会删除位于同一目录中的存储库(或至少,在同一 unix 树中) 作为我想保留的其他东西。因此,虽然我从来没有打错任何路径,但确实没有问题,但我不想让它变得比必要的更容易。

标签: linux git file-permissions


【解决方案1】:

您可以在 .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快得多。我仍然接受了另一个答案,因为它感觉是一个更“正确”和安全的解决方案。
【解决方案2】:

首先,你收集所有垃圾对象:

git gc --prune=all

那么就只剩下一个pack文件,是只读的,和对应的pack index,也是只读的。现在

cd ..
rm -r repo

只会要求确认两次而不是数千次。

不过,这并不能防止移除已签出的子模块。

【讨论】:

    猜你喜欢
    • 2016-04-28
    • 2012-03-27
    • 2020-04-20
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-11-04
    • 2013-02-25
    相关资源
    最近更新 更多