2013-03-08 67 views
22

我想白名單目錄(及其內容)SupplierName在我的Zend Framework 2供應商目錄。.gitignore白名單上的目錄及其內容

中/供應商原來的.gitignore文件看起來是這樣的:

# Add here the vendor path to be whitelisted 
# Ex: for composer directory write here "!composer" (without quotes) 
!.gitignore 
* 

現在我想列入白名單這應該不是太難我以爲目錄SupplierName。我有read the docs on gitignore並嘗試了以下配置:

第一次嘗試,在評論後面添加!!SupplierName,表示我必須在此添加白名單路徑。

# Add here the vendor path to be whitelisted 
!SupplierName 
# Ex: for composer directory write here "!composer" (without quotes) 
!.gitignore 
* 

之後,我執行git status沒有顯示供應商/供應商名稱目錄。 git add vendor/SupplierName顯示以下信息:

以下路徑是由您的.gitignore文件中的一個被忽略:供應商/ SupplierName

第二次嘗試

# Add here the vendor path to be whitelisted 
# Ex: for composer directory write here "!composer" (without quotes) 
!SupplierName 
!.gitignore 
* 

權後,我執行git status沒有顯示供應商/供應商名稱目錄。 git add vendor/SupplierName顯示以下信息:

以下路徑是由您的.gitignore文件中的一個被忽略:供應商/ SupplierName

第三次嘗試

# Add here the vendor path to be whitelisted 
# Ex: for composer directory write here "!composer" (without quotes) 
!.gitignore 
* 
!SupplierName 

權後,我執行git status沒有顯示供應商/供應商名稱目錄。 git add vendor/SupplierName似乎工作。但是現在,當我想添加Module.php文件(以及一些其他文件,子目錄等)時,會發生以下情況。 - git add vendor/SupplierName/Module.php>

以下路徑是由您的.gitignore文件中的一個被忽略:供應商/ SupplierName/Module.php

# Add here the vendor path to be whitelisted 
# Ex: for composer directory write here "!composer" (without quotes) 
* 
!.gitignore 
!SupplierName 
!SupplierName/ 
!SupplierName/* 

讓我可以直接在廠商添加文件/ SupplierName,但git add vendor/SupplierName/config/module.config.php仍產生

以下路徑是由您的.gitignore文件中的一個被忽略:供應商/ SupplierName /配置/ module.config.php

我一直在尋找有關遞歸白名單的問題,因爲這似乎是問題,但沒有出現。

+0

爲什麼不簡單地'git add -f vendor/SupplierName' insted與你的git無視規則 – AD7six 2013-03-10 09:12:13

+0

因爲這不是我認爲應該「完成」的方式。除此之外,當有人開始工作時,可能會導致問題。 – 2013-03-12 08:29:25

+0

什麼樣的問題?我認爲你在這裏解決了錯誤的問題。 – AD7six 2013-03-12 11:25:05

回答

25

可以使用2個.gitignore文件來達到預期的效果:

# vendor/.gitignore 
* 
!.gitignore 
!SupplierName/ 
!SupplierName/* 

# vendor/SupplierName/.gitignore 
!* 

我有一個測試回購測試此,似乎爲我添加文件作爲多層次深下的vendor/SupplierName目錄工作。

$ git add . 

$ git status 
# On branch master 
# Changes to be committed: 
# (use "git reset HEAD <file>..." to unstage) 
# 
# modified: vendor/.gitignore 
# new file: vendor/SupplierName/.gitignore 
# new file: vendor/SupplierName/a 
# new file: vendor/SupplierName/b 
# new file: vendor/SupplierName/c 
# new file: vendor/SupplierName/d 
# new file: vendor/SupplierName/dir1/d 
# new file: vendor/SupplierName/dir1/dir4/dir5/dir6/dir7/dir8/dir9/dir10/somefile 
# new file: vendor/SupplierName/dir1/dir4/f1 
# new file: vendor/SupplierName/dir1/dir4/f2 
# new file: vendor/SupplierName/dir1/dir4/f3 
# new file: vendor/SupplierName/dir1/dir4/f4 
# new file: vendor/SupplierName/dir1/e 
# new file: vendor/SupplierName/dir1/f 
# new file: vendor/SupplierName/dir3/dir6/f5 
# new file: vendor/SupplierName/dir3/dir6/f6 
# new file: vendor/SupplierName/dir3/dir6/f7 
# new file: vendor/SupplierName/dir3/dir7/f8 
# new file: vendor/SupplierName/e 
# 
+0

謝謝!這工作。當stackoverflow允許的時候會獎賞賞金 – 2013-03-10 10:12:22

2

從CVS轉移到Git時,我遇到了類似的問題。

與CVS不同,Git不會查看目錄,它將重點放在文件上。

例如,你不能沒有,忽略目錄「一」,但你不能,忽略目錄中的所有文件「A」,例如:A/*

這同樣適用於子目錄如此。

如果目錄「a」有一個子目錄「b」而你忽略了「!a/*」,那麼你仍然可以獲得所有文件的「a/b」。

所以你必須忽略那個「!a/b/*」等等你想要白名單的所有子目錄。

你只需要一個.gitignore文件。

所以你最終的東西,如:

# ignore everything 
* 
# except for .gitignore files in the current directory 
!.gitignore 
# and all files in directory a 
!a/* 
#and all files in subdirectory b 
!a/b/* 

有了這個,你仍然會從A/C和A/B/C中獲取文件。我不確定是否有遞歸子目錄的解決方法。

12

您也可以只用一個.gitignore文件(在你的項目根)實現這一點:

/* 
!/.gitignore 
!/vendor 
/vendor/* 
!/vendor/SupplierName 
2

您應該包括在黑名單中的一切,然後再使在白名單中的每個目錄和subdirctory。 例如,我只想把DIR /opt/source/,DIR /opt/nginx/和文件白名單/home/test/.opt/hello.txt,可以寫.gitignore文件中像這樣使其工作:

/* 
!/.gitignore 
!/opt 
/opt/* 
!/opt/source/ 
!/opt/nginx/ 
!/home 
/home/* 
!/home/test 
/home/test/* 
!/home/test/.opt 
/home/test/.opt/* 
!/home/test/.opt/hello.txt 
1

發現一個有趣的文章:https://jasonstitt.com/gitignore-whitelisting-patterns

所有學分給Jason Stitt。文章從網站上面複製:

不顧一切,然後添加特定的子樹

# Ignore everything 
* 
# But descend into directories 
!*/ 
# Recursively allow files under subtree 
!/subtree/** 
# You can be specific with these rules 
!/some/other/deep/path/** 
!.gitignore 

!*/規則未忽略所有目錄。但Git不會跟蹤目錄,只有文件,所以!*/本身將只允許 下降到完整的目錄樹;它實際上不會允許 任何東西進入回購。通過使用該規則,您只需要一個使用**遞歸通配符的 規則以包含子樹。

如果您沒有使用!*/,則需要額外的規則才能忽略 /subtree /及其子目錄。

不是每個人都喜歡!*/,因爲這意味着,如果任何其他規則 允許一些目錄中發現了一個文件名模式,你不希望在回購 ,目錄本身不會被阻塞。您需要使用 特定規則才能包含此文件。

忽略根目錄,然後添加整個子樹

# Ignore everything in the root 
/* 
# Un-ignore all of subtree 
!/subtree/ 
!.gitignore 

這種模式比前一個略顯粗糙。 /*規則只會忽略目錄結構根目錄中的項目,因此,只要將目錄列入白名單,即使不使用 ***通配符,目錄的所有內容也都將被允許。

忽略目錄中的一切,但保留空目錄

* 
!.gitignore 

Git不會想在回購空目錄,因爲它 跟蹤文件。將一個隱藏的文件(如.gitignore)放入 目錄中,它將被保存。但是爲了保持目錄爲空,即使是 (如果您有用於測試/開發目的的文件),也可以忽略除.gitignore文件本身以外的所有內容。

相關問題