2017-03-03 78 views
0

我尝试从本地git仓库与删除文件:如何使用git从repo中删除大量文件?

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 

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

回答

3

您遇到的问题是发生在壳体内部(bash)本身,与Git无关。幸运的是,有一种解决方案直接使用Git。 :-)

此:

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

是对外壳请求寻找,在一个指定的目录,所有文件名称以.png结束。 shell将检查目录,找到所有这些文件,并将它们变为ls命令的单个参数。举例来说,如果有只有三个这样的文件,a.pngb.png,这将做同样的事情:

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

具有外壳扩展这样的名字的过程称为globbing

但是,因为有这么多的文件,该壳本身用完的空间扩大所有的名字才可以运行ls

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

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

直接到git rm本身。诀窍是,你必须保护星号(*)从壳,即,使外壳的glob-展开:

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

是否使用单或双引号是有点壳依赖;在bash中,这两种情况都是这样做的,但单引号也可以防止$和其他几种扩展操作,而双引号只能防止globbing- $扩展仍然会发生。

(并非所有的Unix的十岁上下的方案,事实上,很少,做这样的水珠扩张。事实上,由于Shell会,这种方案不会。混帐使异常的许多原因,包括这种事实,例如.gitignore.gitattributes文件。)

此删除过程可能需要很长时间!需要注意的是:

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

要求Git的递归删除所有文件和目录dataset/82146_images/train/labels,命名为*.png即,不只是顶层文件,因此比*.png会这可能会删除甚至多个文件,但如果git rm -r是需要很长时间,所以将glob扩大git rm


技术上,*.png只匹配文件,其名称不以文字句.开始。也就是说,如果存在名为a.png,b.png.hidden.png的文件,则该文件与a.pngb.png匹配,但不匹配.hidden.png

相关问题