2013-06-06 44 views
3

我正在開發magento的擴展。工作目錄中有很多文件,但是我只需要在git中添加擴展名中添加的文件。我如何在這個案例的.gitignore規則中定義?Git - 如何僅包含整個工作樹中的某些文件和目錄?

我想這一點 - 的.gitignore

* 
!/app/etc/modules/Some_Ext.xml 
!/app/code/local/Some/Ext/ 
!/app/designer/... 
... - etc. 

但是當我嘗試git的狀態它只顯示的.gitignore本身。

當我用某些dirs替換星號時,它不會改變任何東西。什麼是實現我的目標的正確方法?

+0

因爲你''...在你的榜樣,我不能肯定,但這可能是因爲您需要明確地取消管理包含您不希望忽略的文件的目錄。例如'!/應用/'。 –

+0

我試圖把第一行改成'/ *',它工作正常。但我不知道如何解釋它。 – dyng

+0

@CharlesBailey - '...'表示文件和子目錄的類似列表。 'app'包含我不需要的東西,如果我添加'!/ app /' - 我必須再次過濾它,不是嗎?以及如何避免它?或者忽視dirs及其內容的原則是什麼? – Taras

回答

9

UPDATE

有一個簡單的解決方案:

* 
!*/ 
!/app/etc/modules/Some_Ext.xml 
!/app/code/local/Some/Ext/ 
!/app/designer/... 
... - etc. 

第二線將包括所有的目錄,然後再下面的模式才能生效。


那麼,已經探討了源代碼,我發現'gitignore'機制在某種程度上真的很棘手。

總結如下幾點:

  1. 小心忽略的目錄。 Git以遞歸方式搜索未跟蹤文件,忽略目錄會導致git跳過該目錄並自動忽略所有文件/子目錄,即使你有一個「not」模式。所以

    /app 
    !/app/code/index.php 
    

    不會救index.php,將連同/app忽略。

  2. 盡你所能,用*.xml/txt/conf/etc...代替。從不使用獨立的*是一個好主意,因爲它會忽略任何目錄,這可能不是你想要的。

  3. 沒有優先但是訂單。對於目錄或文件,git將匹配.gitignore的路徑並使用末尾的匹配模式。如果最後一個匹配的模式具有前導!,git將包含文件/目錄,否則將忽略它。

    所以

    *.xml 
    !/app/etcmodules/Some_Ext.xml 
    

    將保留Some_Ext.xml

    !/app/etcmodules/Some_Ext.xml 
    *.xml 
    

    將篩選出來。

  4. 將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會

  1. 掃描工作目錄,發現有一個常規文件a.conf和兩個目錄bc
  2. 注意到文件a.conf匹配*.conf.gitignore,然後忽略它。
  3. b是一個目錄,但被b/.gitignore排除,停止遞歸到b
  4. 因爲b被排除,b/b.conf從未被掃描過。 (儘管他在.gitignore的第三行中沒有隱瞞)
  5. c是一個目錄,看起來不錯,包含它並繼續遞歸到它。
  6. 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 
+0

謝謝,這對我來說開始有意義。 !'如果它必須具有更高的優先級,則被忽略。 – Taras

+0

@Taras我已更新答案:) – dyng

+0

謝謝@dyng!現在我明白了。如果我爲'app /'和'!app/code/file.php'設置了忽略,它將忽略'app/code /',因爲它不匹配'not'模式,並且將永遠不會去查找其他'不'模式。如果我是對的,它不會將模式看作目錄/文件,只是字符串來匹配項目的路徑字符串。 – Taras

0

您可以嘗試用!app/替代!/app/

+0

是的,我試過了!/ app /,!app /,!app/* - 都一樣 – Taras

相關問題