我尝试使用以下命令从本地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
但提示似乎永远停留在......
答案 0 :(得分:3)
您遇到的问题发生在shell(bash
)本身内部,与Git几乎没有关系。幸运的是,有一个解决方案涉及直接使用Git。 : - )
此:
ls dataset/82146_images/train/labels/*.png
是对 shell 的请求,在一个命名目录中查找名称以.png
结尾的所有 1 文件。 shell将检查目录,查找所有此类文件,并将它们转换为ls
命令的单个参数。例如,如果只有三个这样的文件a.png
和b.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.png
,b.png
和.hidden.png
的文件,则匹配a.png
和b.png
,但不匹配.hidden.png
。