2016-02-28 64 views
1

我不小心將一個巨大的文件添加到我的回購(〜250 MB),名稱爲--exclude。這個文件是在我爲這個回購編寫一些新代碼時在OS X上生成的。現在,我試圖學習如何從Git的歷史記錄herehere中刪除它。教程很好,很清楚,但問題是,Git「認爲」--exclude不是一個文件,而是一個選項。Git:刪除歷史記錄中名爲類似CLI選項的文件

當我運行此命令:

git filter-branch \ 
    --index-filter "git rm -r --cached --ignore-unmatch '--exclude' " HEAD

Git的抱怨:

error: unknown option `exclude' 
usage: git rm [<options>] [--] <file>... 

我試圖用文件的SHA數量,而是改變nothing.What是刪除這樣的文件的正確方法是什麼?

+1

你可以嘗試使用通配符嗎?不確定什麼git接受,但也許'*排除'? –

+0

@ LasseV.Karlsen是的,你可以。好主意!看[我的回答](http://stackoverflow.com/a/35681754/674064)。 –

回答

3

構建說法線常見的Unix方式是

<command> <keys&arguments> [--] <arguments> 

在你平時的密鑰由領先-小號檢測情況

command: git rm 
keys: -r --cached --ignore-unmatch 
arguments: '--exclude' 

但是你可以強制使用-- 所以,你得到

git filter-branch --index-filter "git rm -r --cached --ignore-unmatch -- '--exclude' " HEAD 
+1

請注意,這個答案被稱爲「鍵」的東西通常也被稱爲「選項」,鍵/選項也是參數,所以這個答案稱爲「參數」的東西有時被稱爲「非選項參數」。進一步注意(大多數其他UNIX命令除外)大多數(可能全部)git子命令,你不能在'--'分隔符之後放置任意的非選項參數,而只能放置文件和目錄。 –

3

嘗試至少從文件參數分離git rm選項,使用「--」(雙連字符)

git filter-branch --index-filter "git rm -r --cached --ignore-unmatch -- '--exclude' " HEAD 
                     ^^ 
                   (double-hyphen) 

查看更多關於與雙連字符語法「Deleting a badly named git branch」。

2

推薦的方式做到這一點是使用--分離器在該行的參數部分明確地寫他們將其移動到參數as seen in the answers by VonCand Lol4t0並在其後放置文件名稱。

但是使用通配符來避免--exclude--…部分,因爲Lasse suggests in a comment的確可以工作,因爲Git似乎自己做通配符擴展,而與shell無關。

如果你只是在一個單一的,手動git rm使用它,你必須要麼

  • 逃避它:

    git rm -r --cached --ignore-unmatch \*exclude 
    

  • 引號,

    git rm -r --cached --ignore-unmatch '*exclude' 
    

  • 刪除實際文件第一

    rm ./--exclude 
    git rm -r --cached --ignore-unmatch *exclude 
    

這樣shell已經不進行擴展和通配符傳遞給所有飯桶。但在

git filter-branch \ 
    --index-filter "git rm -r --cached --ignore-unmatch *exclude" HEAD 

整個內部命令反正引用,並git filter-branch似乎並沒有調用shell來解釋它,所以這個作品原樣。 (使用嵌套命令可能是Git完全實現自己的通配符擴展的原因。)

相關問題