$ git status On branch feature/20160420_complain_630222 Untracked files: (use "git add <file>..." to include in what will be committed)
在文件夾中,經常會有些“其他”文件,比如上節課最后提到的,編輯器產生~結尾的備份文件,或者一些臨時文件。又可能,某些文件我們只是在本地使用,並不想提交到遠程的倉庫中被別人看到。但如果我們不跟蹤這些文件,Git會一直很執着地提醒我們工作目錄中有一些未被跟蹤的文件。如果你想清凈一點,就可以通過.gitignore文件忽略你不想看到的文件。
要感受一下忽略文件的效果,首先你得有打算忽略的文件,所以我們強行創建一個叫做readme.txt.tmp的文件,假設它是readme.txt產生的臨時文件。
git status 看一下效果,同上節課中一樣,在untracked files里列出了這個文件:
# On branch master
# Untracked files:
# (use "git add <file>..." to include in what will be committed)
#
# readme.txt.tmp
nothing added to commit but untracked files present (use "git add" to track)
然后我們在工作目錄中新建一個.gitignore文件,在里面寫上一行:
*tmp
保存退出,再運行 git status:
# On branch master
# Untracked files:
# (use "git add <file>..." to include in what will be committed)
#
# .gitignore
nothing added to commit but untracked files present (use "git add" to track)
readme.txt.tmp文件消失了,untracked files里只剩下剛創建的.gitignore文件。
來看一下《Pro Git》里對.gitignore格式規范的解釋:
-
所有空行或者以注釋符號 # 開頭的行都會被 Git 忽略。
-
可以使用標准的 glob 模式匹配。
-
匹配模式最后跟反斜杠(/)說明要忽略的是目錄。
-
要忽略指定模式以外的文件或目錄,可以在模式前加上驚嘆號(!)取反。
所謂的 glob 模式是指 shell 所使用的簡化了的正則表達式:
星號(*)匹配零個或多個任意字符;
[abc] 匹配任何一個列在方括號中的字符(這個例子要么匹配一個 a,要么匹配一個 b,要么匹配一個 c);
問號(?)只匹配一個任意字符;
如果在方括號中使用短划線分隔兩個字符,表示所有在這兩個字符范圍內的都可以匹配(比如 [0-9] 表示匹配所有 0 到 9 的數字)。
所以我們前面寫的 *tmp,就是指忽略所有以tmp結尾的文件。
再來看一個 .gitignore 文件的例子:
# 此為注釋 – 將被 Git 忽略
# 忽略所有 .a 結尾的文件
*.a
# 但 lib.a 除外
!lib.a
# 僅僅忽略項目根目錄下的 TODO 文件
# 不包括 subdir/TODO
/TODO
# 忽略 build/ 目錄下的所有文件
build/
# 忽略 doc 目錄下的所有 .txt 文件
# 會忽略 doc/notes.txt
# 但不包括 doc/server/arch.txt
doc/*.txt
當然,你也可以把.gitignore文件本身從git中忽略。但我不建議這么做,而是所有協作開發者使用統一的規范,避免有人因為沒寫.gitignore而提交上去一些奇怪的文件。
在項目一開始就把.gitignore設置好,不僅是為了好看,也是避免不必要的文件對代碼產生干擾。比如有些需要本地生成的文件,如果放在遠程倉庫中被其他人下載使用,也可能會導致程序無法正常運行。
