2016-08-03 62 views
3

給定一個簡單的測試庫與一個有兩個文件,ab承諾,我能得到的具體文件列表:如何從git檔案中排除文件?

$ git ls-files a 
a 

或所有文件的列表中排除特定的文件:

$ git ls-files . ':!b' 
a 

我可以創建的具體文件的存檔:

$ git archive HEAD a | tar tf - 
a 

但我不能創建的存檔LL文件排除特定文件:

$ git archive HEAD . ':!b' | tar tf - 
a 
b 

使用的特定文件歸檔的選項在我的真實資料庫我的選擇,因爲它超過了最大命令行參數的長度。

我知道我可以通過export-ignore屬性存儲要排除的文件列表.gitattributes,但列表是動態生成的。我可以自動更改文件,但更改在另一次提交之後纔會被提取。

有沒有其他的調用工作,無需另一次提交?

回答

5

我下面的文件夾和文件認爲你幾乎可以釘住它:屬性可以從幾個地方讀取,.gitattributes只是其中最常見的。第二個—認爲每個資源庫配置—是$GIT_DIR/info/attributes

舉手冊:

注意屬性默認情況下從 樹.gitattributes文件被存檔服用。如果你想調整輸出的事實後產生 的方式(例如您承諾不增加其.gitattributes適當 export-ignore),調整簽出.gitattributes文件 必要和使用--worktree-attributes選項。或者,您可以保留 $GIT_DIR/info/attributes文件中歸檔任何樹時應用的必要屬性。

因此,如果可能,請將您的列表粘貼到該文件中,然後執行git archive

另一種方法是不使用git archive,而是僅使用tar工作樹通過tar--exclude-from命令行選項接受文件。這不適用於裸倉庫,但如果您在歸檔之前檢查了某些內容,那麼可以通過執行git read-treegit checkout-index以及正確的​​和$GIT_WORK_TREE env提供。變量。

另一種可能的解決方法是扭轉方法:tar(至少GNU焦油)支持能夠從管道中的檔案刪除東西一個鮮爲人知的選項。

基本上,你可以做

$ tar -C a_path -c -f - . \ 
    | tar -f - --wildcards --delete '*.pdf' >result.tar 

這樣在管線檔案管理一切的第一tar而第二個通過一切通過除匹配*.pdf殼水珠彭定康文件。

因此,如果使用shell globs指定要刪除的文件可以適合命令行限制,只需將git archive的輸出傳送到tar prcocess,即可刪除不需要的東西。

+0

感謝您的詳細解答。我認爲'.git/info/attributes'不一定是最合乎邏輯的方法,但它最適合我已有的,如果將來我還需要更多東西,我可以將其更改爲'tar --delete' 。 – hvd

3

您可以創建一個焦油,然後刪除不需要在裏面

git archive HEAD -o archive.tar 
tar -f archive.tar --delete listoffiles1 
tar -f archive.tar --delete listoffiles2 
tar -f archive.tar --delete listoffiles.. 
tar -f archive.tar --delete listoffilesN 

這種方式,您可以分割您的命令行留下最大CLI參數長度

1

您可以將export-ignore放入(提交).gitattributes中,而不是將其放入(未提交)$GIT_DIR/info/attributes文件中。或者,也可以將.gitattributes保留爲未提交,並使用--worktree-attributes選項,但這可能不太好,因爲它會讓工作樹變髒。