Git 忽略規(guī)則
一般來說每個Git項目中都需要一個“.gitignore”文件疾层,這個文件的作用就是告訴Git哪些文件不需要添加到版本管理中却邓。實際項目中粱胜,很多文件都是不需要版本管理的亡嫌,比如Python的.pyc文件和一些包含密碼的配置文件等等。這個文件的內容是一些規(guī)則泵额,Git會根據這些規(guī)則來判斷是否將文件添加到版本控制中。
下面我們看看常用的規(guī)則:
1)/mtk/ 過濾整個文件夾
2)*.zip 過濾所有.zip文件
3)/mtk/do.c 過濾某個具體文件
很簡單吧携添,被過濾掉的文件就不會出現在git倉庫中(gitlab或github)了嫁盲,當然本地庫中還有,只是push的時候不會上傳烈掠。
需要注意的是羞秤,gitignore還可以指定要將哪些文件添加到版本管理中:
1)!*.zip
2)!/mtk/one.txt
唯一的區(qū)別就是規(guī)則開頭多了一個感嘆號,Git會將滿足這類規(guī)則的文件添加到版本管理中左敌。
為什么要有兩種規(guī)則呢瘾蛋?想象一個場景:假如我們只需要管理/mtk/目錄中的one.txt文件,這個目錄中的其他文件都不需要管理矫限,那么我們就需要使用:
1)/mtk/
2)!/mtk/one.txt
假設我們只有過濾規(guī)則哺哼,而沒有添加規(guī)則,那么我們就需要把/mtk/目錄下除了one.txt以外的所有文件都寫出來叼风!
最后需要強調的一點是取董,如果你不慎在創(chuàng)建.gitignore文件之前就push了項目,那么即使你在.gitignore文件中寫入新的過濾規(guī)則无宿,這些規(guī)則也不會起作用茵汰,Git仍然會對所有文件進行版本管理。
簡單來說孽鸡,出現這種問題的原因就是Git已經開始管理這些文件了蹂午,所以你無法再通過過濾規(guī)則過濾它們坡垫。因此一定要養(yǎng)成在項目開始就創(chuàng)建.gitignore文件的習慣,否則一旦push画侣,處理起來會非常麻煩冰悠。
Xcode項目的 .gitignore 配置
git版本控制的時候,有很多非代碼文件也會被跟蹤配乱,比較常見的如一些影藏文件DS_Store溉卓、以xcworkspace、xcuserstate搬泥、xcuserdata等結尾的狀態(tài)文件等桑寨。為了不把這些文件加入版本控制體系中,我們需要進行以下三步設置忿檩,注意尉尾,每一步必不可少,也不可交換位置燥透,下文會具體解釋原因沙咏。
第一步:進入git的代碼倉庫,執(zhí)行以下的代碼
// 刪除已被git管理的文件
git rm --cached *.xcuserstate
git rm --cached *.xcuserdata
這兩行代碼(或者可以有更多班套,自己修改后綴名即可肢藐,這里列出了常見的兩種隱藏文件)表示不再追蹤以這些后綴結尾的文件,注意這里的文件在執(zhí)行代碼前其實已經被追蹤(Tracked)吱韭,執(zhí)行完后吆豹,將不再被追蹤。
// 刪除已被git管理的文件目錄
git rm --cached -r Pods/
第二部:修改.gitignore文件:
vim .gitignore
這時候會進入gitignore的文件的編輯界面理盆,如果這個文件已經存在痘煤,則可以通過普通的文本編輯器直接進行修改(需要設置顯示隱藏文件),復制以下內容進入.gitignore文件猿规。
# Created by https://www.gitignore.io/api/xcode
### Xcode ###
# Xcode
#
# gitignore contributors: remember to update Global/Xcode.gitignore, Objective-C.gitignore & Swift.gitignore
## Build generated
build/
DerivedData/
## Various settings
*.pbxuser
!default.pbxuser
*.mode1v3
!default.mode1v3
*.mode2v3
!default.mode2v3
*.perspectivev3
!default.perspectivev3
xcuserdata/
## Other
*.moved-aside
*.xccheckout
*.xcscmblueprint
### Xcode Patch ###
*.xcodeproj/*
!*.xcodeproj/project.pbxproj
!*.xcodeproj/xcshareddata/
!*.xcworkspace/contents.xcworkspacedata
/*.gcno
# End of https://www.gitignore.io/api/xcode
如果使用CocoaPods衷快,建議將 'Pods/' 添加到忽略文件中:
# CocoaPods
#
# We recommend against adding the Pods directory to your .gitignore. However
# you should judge for yourself, the pros and cons are mentioned at:
# http://guides.cocoapods.org/using/using-cocoapods.html#should-i-ignore-the-pods-directory-in-source-control
#
Pods/
Podfile.lock
按esc鍵退出編輯,輸入:wq保存文件坎拐。
注意這里的gitignore文件的修改烦磁,僅對未追蹤(Untracked)的文件生效,所以首先要執(zhí)行第一步哼勇,取消對以上類型文件的追蹤都伪。
第三步:提交此處版本修改
git commit -m "Modify .gitignore"
記得要執(zhí)行此次提交,否則之前的修改不被保存积担。
重啟Xcode并且嘗試修改一個文件后執(zhí)行commit陨晶,發(fā)現那些與代碼無關的文件并不會被自動提交了。
Git 忽略規(guī)則及 .gitignore 規(guī)則不生效的解決辦法
在git中如果想忽略掉某個文件,不讓這個文件提交到版本庫中先誉,可以使用修改根目錄中 .gitignore 文件的方法(如無湿刽,則需自己手工建立此文件)。這個文件每一行保存了一個匹配的規(guī)則例如:
# 此為注釋 – 將被 Git 忽略
*.a # 忽略所有 .a 結尾的文件
!lib.a # 但 lib.a 除外
/TODO # 僅僅忽略項目根目錄下的 TODO 文件褐耳,不包括 subdir/TODO
build/ # 忽略 build/ 目錄下的所有文件
doc/*.txt # 會忽略 doc/notes.txt 但不包括 doc/server/arch.txt
規(guī)則很簡單诈闺,不做過多解釋,但是有時候在項目開發(fā)過程中铃芦,突然心血來潮想把某些目錄或文件加入忽略規(guī)則雅镊,按照上述方法定義后發(fā)現并未生效,原因是.gitignore只能忽略那些原來沒有被track的文件刃滓,如果某些文件已經被納入了版本管理中仁烹,則修改.gitignore是無效的。那么解決方法就是先把本地緩存刪除(改變成未track狀態(tài))咧虎,然后再提交:
git rm -r --cached .
git add .
git commit -m 'update .gitignore'
注意:
不要誤解了 .gitignore 文件的用途卓缰,該文件只能作用于 Untracked Files,也就是那些從來沒有被 Git 記錄過的文件(自添加以后砰诵,從未 add 及 commit 過的文件)征唬。
如果文件曾經被 Git 記錄過,那么.gitignore 就對它們完全無效胧砰。
參考:
ignore.io推薦
iOS開發(fā)中的git忽略文件
Xcode git版本控制忽略無關文件
Git忽略規(guī)則.gitignore梳理