>[info] 在git或github中有特殊作用,功能的文件,為了便于學習區分,我們先草率的稱它們為功能文件吧。
## 下面就來看幾個常用的功能文件:
### .gitignore文件
被git文件中的規則所匹配文件和目錄不受git版本管理系統控制,具體表現在兩點:
1. 第一在像版本庫push時會自動忽略匹配文件。
2. 第二匹配文件不屬于工作區,雖然它放在工作區,但是對它的修改,不會被git監視和記錄,也就是git status會忽略它。
需要注意的一些問題:
[git .gitignore失效的解決辦法](http://blog.csdn.net/andanlan/article/details/51114306)
[Git忽略規則及.gitignore規則不生效的解決辦法](http://www.pfeng.org/archives/840)
```shell
git rm -r --cached .
git add .
git commit -m 'update .gitignore'
```
注意幾個問題:
1 .gitignore的優先級后面的忽略前面的,也就是子目錄會覆蓋上層的。
2 .git默認不跟蹤空目錄,git add .不能跟蹤空目錄,需要手動指定跟蹤空目錄。
例如如果想要忽略data下面所有的文件和目錄,只保留data這個空目錄的話,只在外層這樣設置是做不到的:
`.gitignore`
~~~
/data/*
~~~
需要在data下:
創建文件 .gitignore
~~~
*
!.gitignore
~~~
**`!.gitignore`是必須的,表示不會忽略自身,否則data被認為是空目錄,只能被忽略了。**
上面的代碼表示git忽略data目錄下的所有文件,但是git又發現data下面也有一個.gitignore文件,并且這個.gitignore文件中的規則明確表示了這里有不能被忽略的文件,比如本例中它表示不能忽略自身。這就是上面說得優先級覆蓋的情況。(注意:.gitignore表示不能忽略的文件必須真實存在才有效哦,否則隨便填規則忽略本不存在的文件是沒有效果的[忽略的是它自己,它自己肯定存在哈],data還是被認為是空目錄的哦)
注意這個覆蓋并不能控制父目錄的規則,及子目錄中只能影響它本身所在目錄,并不能向上越級影響父目錄,/就是相對于當前.gitignore所在目錄,或者不寫也表示.gitignore所在目錄,./并沒有用哦。.gitignore又可以影響當前目錄下面的子目錄,規則同上,同它的父對于它的關系一樣。
>[danger] 注意這里的/data/\*這個*星號,如果不加\*星號,直接是data或者data/,則又是另一種情況了,沒有星號,則表示忽略data這個目錄,是徹底的忽略哦,連/data/.gitignore都給忽略掉了哦,**/data/.gitignore明確表示不忽略自身也沒有用!**,在外層就已經把這個目錄忽略掉了,git根本就不會進來看一眼,**所以這種情況不存在.gitignore文件優先級覆蓋**,而有星號則表示忽略data下面的所有文件,但如果data/.gitignore中沒有明確表示不能忽略的文件,那么data目錄本身也會被忽略,這是因為當為空目錄時也會自動忽略掉,請注意這一點哦。
正是應為這個問題,所以像Discuz這樣的程序就有點不合理了,比如我們需要忽略一些日志和模板緩存文件,在根目錄下面的
`.gitignore`中設置
~~~
/data/log/*
/data/cache/*
/data/template/*
~~~
這樣會忽略整個目錄,而不能保留我們想要的空目錄(原因上面已經說了),我們必須在/data/template/里面也設置`.gitignore`(參考上面),這樣才能做到僅保留空目錄,但是顯然Discuz清空緩存可能將`.gitignore`刪除掉。這很令人苦惱,因為完全忽略目錄了,那么這個目錄就沒有被跟蹤,就沒有這個目錄了,但如果程序里面做好處理,比如不依賴于/data/template/必須存在,而是會自動創建,這樣就好了,但是Discuz比較死板,這樣造成的問題就是我們在這里無法實現忽略緩存文件的同時又保留(不忽略)緩存目錄這個空目錄,所以我們采用完全忽略的方式,克隆倉庫后,運行程序,出錯的話(因找不到緩存目錄),我們需要手動創建緩存目錄。顯然如果程序做的智能一點自動創建目錄的話就不會出現這樣的情況了。如果采用第二種常規方案,則又擔心程序情況緩存時將`.gitignore`刪除掉,可想而知程序才沒想到這個呢。
(這里注意:.gitignore一開始就要設計好,不然就算后期添加忽略這個文件夾,也還是沒用,還是會顯示出來,因為已經提交了,只有刪除才能從倉庫去掉,所以.gitignore從一開始就要設計好,不然后期處理就會比較麻煩。)
>[danger] 最后需要強調的一點是,如果你不慎在創建.gitignore文件之前就push了項目,那么即使你在.gitignore文件中寫入新的過濾規則,這些規則也不會起作用,Git仍然會對所有文件進行版本管理。
簡單來說,出現這種問題的原因就是Git已經開始管理這些文件了,所以你無法再通過過濾規則過濾它們。
所以大家一定要養成在項目開始就創建.gitignore文件的習慣,否則一旦push,處理起來會非常麻煩。
**(可能沒說明白,其實git管理的是舊的文件,添加過濾之后,此后的更改就不會再被跟蹤,但是先前的跟蹤還在,所以需要需要刪掉先前的那么只能清除緩存,重新建立跟蹤索引。)**
[.gitignore詳解](http://sentsin.com/web/666.html)
參考:
[忽略特殊文件](http://www.liaoxuefeng.com/wiki/0013739516305929606dd18361248578c67b8067c8c017b000/0013758404317281e54b6f5375640abbb11e67be4cd49e0000)
[Git 中的文件忽略(轉)或 git中要忽略某文件夾下的一部分文件或文件夾](http://cooliron.blog.163.com/blog/static/1247031382013023103231950/)
>[info] 如果忽略意圖明確,目錄前最好加上/,比如/data/表示忽略的該目錄在此目錄下,否則會遞歸子目錄的。后面加上/表示忽略整個目錄,但同名文件不忽略。沒有/則代表的是文件或者目錄。
~~~
若test下有多個文件和文件夾。若要ignore某些文件夾,應該這個配置.gitignore文件。若test下有test1,test2,test3文件。要track test3,則.gitignore文件為:
test/test1
test/test2
!test/test3
若為:
test/
!test/test3
則不能track test3。
~~~
>[danger] 上面的測試說明:.gitignore的優先級是后面的會覆蓋前面的(**請注意上面討論的覆蓋情況**),但那是子文件夾,對于同一文件中,“小定義”并不能覆蓋“大定義”。
### 需要注意的問題:
很多程序都有清理緩存的的功能,比如:

在應用目錄中的.gitignore文件
`app/.gitignore`
~~~
.idea
composer.lock
*.log
thinkphp
~~~
顯然是不想忽略runtime目錄
`app/runtime/.gitignore`
~~~
*
!.gitignore
~~~
忽略該運行時目錄下所有文件,但不忽略.gitignore(讓他人可以沿用),保留運行時目錄(只要目錄不為空就不會忽略),但是保留這是很常見的做法,但是很多程序清理緩存時根本沒有考慮這些,下面就來改寫清除緩存方法:
~~~
// 遞歸刪除文件夾
function delFile($dir,$file_type='') {
if(is_dir($dir)){
$files = scandir($dir);
//打開目錄 //列出目錄中的所有文件并去掉 . 和 ..
foreach($files as $filename){
if($filename!='.' && $filename!='..' && $filename!='.gitignore'){
if(!is_dir($dir.'/'.$filename)){
if(empty($file_type)){
unlink($dir.'/'.$filename);
}else{
if(is_array($file_type)){
//正則匹配指定文件
if(preg_match($file_type[0],$filename)){
unlink($dir.'/'.$filename);
}
}else{
//指定包含某些字符串的文件
if(false!=stristr($filename,$file_type)){
unlink($dir.'/'.$filename);
}
}
}
}else{
delFile($dir.'/'.$filename);
rmdir($dir.'/'.$filename);
}
}
}
}else{
if(file_exists($dir)) unlink($dir);
}
}
~~~
這樣就排除了.gitignore了。
### README.md文件
項目的自述文件,默認打開github項目主頁就會顯示這個自述。
### CONTRIBUTING.md文件
github規定的用于他人提issues時提示的指導說明文件,此文件可以幫助引導他人怎樣為此開源項目做貢獻。
還有一些其他功能文件,參考:[貢獻內容的自動檢查](http://www.hmoore.net/thinkphp/github-tips/37899)
- [github上的.gitignore和.gitattributes這兩個文件是干什么的?](github上的.gitignore和.gitattributes這兩個文件是干什么的?)
- 說明
- git配置
- git與github的關系
- 基礎概念
- git命令
- git init
- git status
- git diff
- git log
- git reflog
- git add
- git commit
- git reset
- git checkout
- git rm
- git stash
- git remote
- git push
- git clone
- git branch
- git fetch
- git merge
- git rebase
- git pull
- git tag
- 建立版本庫
- 分支合并
- 遠程庫別名
- Pull requests
- 擴展知識
- 功能文件
- 差異看法
- 注意細節
- github移動端
- git工作系統理解
- 倉庫嵌套問題
- 倉庫的使用問題
- 常用命令
- 學習資料
- 學習總結
- 示例文件
- README.md
- CONTRIBUTING.md
- .gitignore
- coding
- 大小寫問題
- 如何貢獻
- 使用賬號密碼clone
- git目錄分析
- HEAD
- 代碼部署問題
- 開發流程
- 指定公鑰文件