2017-03-03 114 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

相關問題