簡體   English   中英

如何使用git從倉庫中刪除大量文件?

[英]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.pngb.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.pngb.png.hidden.png文件,則此文件將匹配a.pngb.png而不是.hidden.png

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM