[英]How to remove a huge amount of files from repo with 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
但是提示似乎永遠卡住了...
您遇到的問題是在shell( bash
)本身內部發生的,與Git無關。 幸運的是,有一個解決方案涉及直接使用Git。 :-)
這個:
ls dataset/82146_images/train/labels/*.png
是對shell的請求,以在一個命名目錄中查找名稱以.png
結尾的所有1個文件。 Shell將檢查目錄,找到所有此類文件,然后將它們變成ls
命令的各個參數。 例如,如果只有三個這樣的文件a.png
和b.png
,則將執行與b.png
操作完全相同的操作:
ls dataset/82146_images/train/labels/a.png dataset/82146_images/train/labels/b.png
像這樣使外殼擴展名稱的過程稱為globbing 。
但是,由於文件太多, shell本身在運行ls
之前就用光了空間來擴展所有名稱。
幸運的是,由於Git具有相同的內置內建函數,因此無需使用shell來擴展所有名稱。 您可以簡單地給出:
dataset/82146_images/train/labels/*.png
直接到git rm
本身。 訣竅是您必須保護星號( *
)不受shell影響 ,即, 不要使shell對其進行全局擴展:
git rm 'dataset/82146_images/train/labels/*.png'
使用單引號還是雙引號在某種程度上取決於外殼程序; 在bash中,在這種情況下,兩者都做相同的事情,但是單引號還可以防止$
和其他一些擴展操作,而雙引號只能防止出現亂碼- $
擴展仍然會發生。
(並非所有類似Unix的程序(實際上很少)都進行這種glob擴展。實際上,由於shell會這樣做,所以大多數此類程序都不會這樣做。Git出於多種原因而成為例外,其中包括這樣的事實例如必須包含.gitignore
和.gitattributes
文件。)
此刪除可能需要很長時間! 注意:
git rm -r dataset/82146_images/train/labels
要求Git遞歸地刪除dataset/82146_images/train/labels
中的所有文件和目錄,即,不僅是名為*.png
頂級文件,所以這可能比*.png
刪除更多的文件,但是如果git rm -r
需要花費很長時間,因此擴展glob的git rm
也將花費很長時間。
1從技術上講, *.png
只匹配名稱不以立即數開頭的文件.
。 也就是說,如果存在名為a.png
, b.png
和.hidden.png
文件,則此文件將匹配a.png
和b.png
而不是.hidden.png
。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.