今是昨非

今是昨非

日出江花红胜火,春来江水绿如蓝

gitignore不忽略指定文件

背景#

在使用腾讯 IMSDK 时,通过 Pod 依赖了对应的库,Pods 文件夹在.gitignore中配置忽略,但是需要修改 IM SDK 的源代码,又怕重新安装后被覆盖,所以想要针对腾讯 IMSDK,在.gitignore中设置不忽略,怎麼做呢?

實現#

設置如下:


!/Pods/
/Pods/*
!/Pods/TUI*/

設置之後,如果發現沒有生效,可以通過下面的命令校驗:


git check-ignore -v Pods/TUIChat/

如下圖,第一次校驗,提示.gitignore中某行導致被忽略,然後修改,再次運行,沒有結果,說明已經成功

示例

原理#

轉載自: [Git].gitignore 文件的配置使用

.gitignore 忽略規則的匹配語法如下:

在 .gitignore 文件中,每一行的忽略規則的語法如下:
1、空格不匹配任意文件,可作為分隔符,可用反斜杠轉義
2、以“#”開頭的行都會被 Git 忽略。即#開頭的文件標識註釋,可以使用反斜杠進行轉義。
3、可以使用標準的glob模式匹配。所謂的glob模式是指shell所使用的簡化了的正則表達式。
4、以斜杠"/"開頭表示目錄;"/"結束的模式只匹配文件夾以及在該文件夾路徑下的內容,但是不匹配該文件;"/"開始的模式匹配項目跟目錄;如果一個模式不包含斜杠,則它匹配相對於當前 .gitignore 文件路徑的內容,如果該模式不在 .gitignore 文件中,則相對於項目根目錄。
5、以星號"*"通配多個字符,即匹配多個任意字符;使用兩個星號"**" 表示匹配任意中間目錄,比如a/**/z可以匹配 a/z, a/b/z 或 a/b/c/z等。
6、以問號"?"通配單個字符,即匹配一個任意字符;
7、以方括號"[]"包含單個字符的匹配列表,即匹配任何一個列在方括號中的字符。比如[abc]表示要麼匹配一個a,要麼匹配一個b,要麼匹配一個c;如果在方括號中使用短劃線分隔兩個字符,表示所有在這兩個字符範圍內的都可以匹配。比如[0-9]表示匹配所有0到9的數字,[a-z]表示匹配任意的小寫字母)。
8、以驚嘆號"!"表示不忽略(跟蹤)匹配到的文件或目錄,即要忽略指定模式以外的文件或目錄,可以在模式前加上驚嘆號(!)取反。需要特別注意的是:如果文件的父目錄已經被前面的規則排除掉了,那麼對這個文件用"!"規則是不起作用的。也就是說"!"開頭的模式表示否定,該文件將會再次被包含,如果排除了該文件的父級目錄,則使用"!"也不會再次被包含。可以使用反斜杠進行轉義。

** 需要謹記:**git 對於.ignore 配置文件是按行從上到下進行規則匹配的,意味著如果前面的規則匹配的範圍更大,則後面的規則將不會生效;

** 十分重要:** 如果你不慎在創建.gitignore 文件之前就 push 了項目,那麼即使你在.gitignore 文件中寫入新的過濾規則,這些規則也不會起作用,Git 仍然會對所有文件進行版本管理。簡單來說出現這種問題的原因就是 Git 已經開始管理這些文件了,所以你無法再通過過濾規則過濾它們。所以大家一定要養成在項目開始就創建.gitignore 文件的習慣,否則一單 push,處理起來會非常麻煩。


#               表示此為註釋,將被Git忽略
*.a             表示忽略所有 .a 結尾的文件
!lib.a          表示但lib.a除外
/TODO           表示僅僅忽略項目根目錄下的 TODO 文件,不包括 subdir/TODO
build/          表示忽略 build/目錄下的所有文件,過濾整個build文件夾;
doc/*.txt       表示會忽略doc/notes.txt但不包括 doc/server/arch.txt
 
bin/:           表示忽略當前路徑下的bin文件夾,該文件夾下的所有內容都會被忽略,不忽略 bin 文件
/bin:           表示忽略根目錄下的bin文件
/*.c:           表示忽略cat.c,不忽略 build/cat.c
debug/*.obj:    表示忽略debug/io.obj,不忽略 debug/common/io.obj和tools/debug/io.obj
**/foo:         表示忽略/foo,a/foo,a/b/foo等
a/**/b:         表示忽略a/b, a/x/b,a/x/y/b等
!/bin/run.sh    表示不忽略bin目錄下的run.sh文件
*.log:          表示忽略所有 .log 文件
config.php:     表示忽略當前路徑的 config.php 文件
 
/mtk/           表示過濾整個文件夾
*.zip           表示過濾所有.zip文件
/mtk/do.c       表示過濾某個具體文件
 
被過濾掉的文件就不會出現在git倉庫中(gitlab或github)了,當然本地庫中還有,只是push的時候不會上傳。
 
需要注意的是,gitignore還可以指定要將哪些文件添加到版本管理中,如下:
!*.zip
!/mtk/one.txt
 
唯一的區別就是規則開頭多了一個感嘆號,Git會將滿足這類規則的文件添加到版本管理中。為什麼要有兩種規則呢?
想象一個場景:假如我們只需要管理/mtk/目錄中的one.txt文件,這個目錄中的其他文件都不需要管理,那麼.gitignore規則應寫為::
/mtk/*
!/mtk/one.txt
 
假設我們只有過濾規則,而沒有添加規則,那麼我們就需要把/mtk/目錄下除了one.txt以外的所有文件都寫出來!
注意上面的/mtk/*不能寫為/mtk/,否則父目錄被前面的規則排除掉了,one.txt文件雖然加了!過濾規則,也不會生效!
 
----------------------------------------------------------------------------------
還有一些規則如下:
fd1/*
說明:忽略目錄 fd1 下的全部內容;注意,不管是根目錄下的 /fd1/ 目錄,還是某個子目錄 /child/fd1/ 目錄,都會被忽略;
 
/fd1/*
說明:忽略根目錄下的 /fd1/ 目錄的全部內容;
 
/*
!.gitignore
!/fw/ 
/fw/*
!/fw/bin/
!/fw/sf/
說明:忽略全部內容,但是不忽略 .gitignore 文件、根目錄下的 /fw/bin/ 和 /fw/sf/ 目錄;注意要先對bin/的父目錄使用!規則,使其不被排除。

如果發現.gitignore不生效,參考: .gitignore 文件中的忽略規則,可嘗試如下操作:

1,git rm -r --cached .
2,git add .
3,git commit -m "update .gitignore"

原因是:當 .gitignore 文件配置好後,往往不能失效。這是因為 .gitignore 只能忽略那些沒有被追蹤 (track) 的文件,因為 git 存在本地緩存,如果文件已經納入了版本管理,那麼修改 .gitignore 是不能失效的。那麼解決方案就是要將 git 的本地緩存刪除,然後重新提交。

參考#

載入中......
此文章數據所有權由區塊鏈加密技術和智能合約保障僅歸創作者所有。