UPDATE:
有一個簡單的解決方案:
*
!*/
!/app/etc/modules/Some_Ext.xml
!/app/code/local/Some/Ext/
!/app/designer/...
... - etc.
第二線將包括所有的目錄,然後再下面的模式才能生效。
那麼,已經探討了源代碼,我發現'gitignore'機制在某種程度上真的很棘手。
總結如下幾點:
小心忽略的目錄。 Git以遞歸方式搜索未跟蹤文件,忽略目錄會導致git跳過該目錄並自動忽略所有文件/子目錄,即使你有一個「not」模式。所以
/app
!/app/code/index.php
不會救index.php
,將連同/app
忽略。
盡你所能,用*.xml/txt/conf/etc...
代替。從不使用獨立的*
是一個好主意,因爲它會忽略任何目錄,這可能不是你想要的。
沒有優先但是訂單。對於目錄或文件,git將匹配.gitignore
的路徑並使用末尾的匹配模式。如果最後一個匹配的模式具有前導!
,git將包含文件/目錄,否則將忽略它。
所以
*.xml
!/app/etcmodules/Some_Ext.xml
將保留Some_Ext.xml
但
!/app/etcmodules/Some_Ext.xml
*.xml
將篩選出來。
將git更新到版本1.8.2可能會有幫助。在1.8.2中,他們添加一個命令git check-ignore
來調試您的.gitignore
配置。
我想git add -A
工作流程可以進一步解釋。
假設有一個這樣的存儲庫。
.
├── a.conf
├── b
│ └── b.conf
└── c
└── c1
└── c2
└── c.conf
而且在.gitignore
是
*.conf
b/
!b/b.conf
!c/c1/c2/c.conf
當我運行git add -A
,git會
- 掃描工作目錄,發現有一個常規文件
a.conf
和兩個目錄b
和c
。
- 注意到文件
a.conf
匹配*.conf
在.gitignore
,然後忽略它。
b
是一個目錄,但被b/
的.gitignore
排除,停止遞歸到b
。
- 因爲
b
被排除,b/b.conf
從未被掃描過。 (儘管他在.gitignore
的第三行中沒有隱瞞)
c
是一個目錄,看起來不錯,包含它並繼續遞歸到它。
c/c1/c2/c.conf
匹配兩種模式,但最後一種決定命運。因爲最後匹配的圖案!c/c1/c2/c.conf
有領先的!
,所以c/c1/c2/c.conf
會存活。
這裏是git add -A
結果在我的機器(Mac上的1.8.2版本的git)
# On branch master
#
# Initial commit
#
# Changes to be committed:
# (use "git rm --cached <file>..." to unstage)
#
# new file: .gitignore
# new file: c/c1/c2/c.conf
因爲你''...在你的榜樣,我不能肯定,但這可能是因爲您需要明確地取消管理包含您不希望忽略的文件的目錄。例如'!/應用/'。 –
我試圖把第一行改成'/ *',它工作正常。但我不知道如何解釋它。 – dyng
@CharlesBailey - '...'表示文件和子目錄的類似列表。 'app'包含我不需要的東西,如果我添加'!/ app /' - 我必須再次過濾它,不是嗎?以及如何避免它?或者忽視dirs及其內容的原則是什麼? – Taras