如何使用git从repo中删除大量文件?

时间:2017-03-03 20:03:24

标签: git

我尝试使用以下命令从本地git仓库中删除文件:

ls dataset/82146_images/train/labels/*.png | xargs git rm

但是参数列表太长了:

$ ls dataset/82146_images/train/labels/*.png | xargs git rmbash: /bin/ls: Liste d'arguments trop longue
usage : git rm [<options>] [--] <fichier>...

    -n, --dry-run         simuler l'action
    -q, --quiet           ne pas afficher les fichiers supprimés
    --cached              supprimer seulement de l'index
    -f, --force           outrepasser la vérification des fichiers à jour
    -r                    autoriser la suppression récursive
    --ignore-unmatch      sortir avec un statut zéro même si rien ne correspondait

我也试试:

$ git rm -r dataset/82146_images/train/labels

但提示似乎永远停留在......

1 个答案:

答案 0 :(得分:3)

您遇到的问题发生在shell(bash)本身内部,与Git几乎没有关系。幸运的是,有一个解决方案涉及直接使用Git。 : - )

此:

ls dataset/82146_images/train/labels/*.png

是对 shell 的请求,在一个命名目录中查找名称以.png结尾的所有 1 文件。 shell将检查目录,查找所有此类文件,并将它们转换为ls命令的单个参数。例如,如果只有三个这样的文件a.pngb.png,那么这将完全相同:

ls dataset/82146_images/train/labels/a.png dataset/82146_images/train/labels/b.png

让shell扩展名称的过程称为globbing

但是,因为有太多文件, shell本身空间不足以扩展之前的所有名称​​它可以运行ls

幸运的是,没有必要使用 shell 来扩展所有名称,因为Git具有相同的globbing内置。你可以简单地给出:

dataset/82146_images/train/labels/*.png

直接向git rm本身。诀窍是你必须保护星号(*)不受shell 的影响,即使shell 全球扩展它:

git rm 'dataset/82146_images/train/labels/*.png'

是否使用单引号或双引号有点依赖于shell;在bash中,对于这种情况,两者都做同样的事情,但是单引号也可以防止$和其他几个扩展操作,而双引号仅保护全局 - $扩展仍然会发生。

(并非所有Unix-ish程序 - 事实上,很少 - 做这种全局扩展。实际上,因为shell会,大多数这样的程序不会 .Git出于多种原因而出现异常,例如,它必须包含.gitignore.gitattributes文件。)

此删除可能需要很长时间!请注意:

git rm -r dataset/82146_images/train/labels

要求Git递归删除dataset/82146_images/train/labels中的所有文件和目录,即不只是名为*.png的顶级文件,因此这可能会删除比*.png更多的文件{1}}会,但如果git rm -r需要很长时间,那么全球展开git rm也会如此。

1 从技术上讲,*.png仅匹配名称不以文字句点.开头的文件。也就是说,如果有名为a.pngb.png.hidden.png的文件,则匹配a.pngb.png,但不匹配.hidden.png