在使用Git的過程中,我們喜歡有的文件比如日誌,臨時文件,編譯的中間文件等不要提交到代碼倉庫,這時就要設置相應的忽略規則,來忽略這些文件的提交。簡單來說一個場景:在你使用git add .的時候,遇到了把你不想提交的文件也添加到了緩存中去的情況,比如項目的本地配置信息,如果你上傳到Git中去其他人pull下來的時候就會和他本地的配置有衝突,所以這樣的個性化配置文件我們一般不把它推送到git服務器中,但是又爲了偷懶每次添加緩存的時候都想用git add .而不是手動一個一個文件添加,該怎麼辦呢?很簡單,git爲我們提供了一個.gitignore文件只要在這個文件中申明那些文件你不希望添加到git中去,這樣當你使用git add .的時候這些文件就會被自動忽略掉。
有三種方法可以實現忽略Git中不想提交的文件:
1)在Git項目中定義.gitignore文件
對於經常使用Git的朋友來說,.gitignore配置一定不會陌生。這種方式通過在項目的某個文件夾下定義.gitignore文件,在該文件中定義相應的忽略規則,來管理當前文件夾下的文件的Git提交行爲。.gitignore 文件是可以提交到公有倉庫中,這就爲該項目下的所有開發者都共享一套定義好的忽略規則。在.gitingore 文件中,遵循相應的語法,在每一行指定一個忽略規則。如:
1 2 3 |
|
2)在Git項目的設置中指定排除文件
這種方式只是臨時指定該項目的行爲,需要編輯當前項目下的 .git/info/exclude文件,然後將需要忽略提交的文件寫入其中。需要注意的是,這種方式指定的忽略文件的根目錄是項目根目錄。
3)定義Git全局的 .gitignore 文件
除了可以在項目中定義 .gitignore 文件外,還可以設置全局的git .gitignore文件來管理所有Git項目的行爲。這種方式在不同的項目開發者之間是不共享的,是屬於項目之上Git應用級別的行爲。這種方式也需要創建相應的 .gitignore 文件,可以放在任意位置。然後在使用以下命令配置Git:
1 |
|
首先要強調一點,這個文件的完整文件名就是".gitignore",注意最前面有個“.”。一般來說每個Git項目中都需要一個“.gitignore”文件,這個文件的作用就是告訴Git哪些文件不需要添加到版本管理中。實際項目中,很多文件都是不需要版本管理的,比如Python的.pyc文件和一些包含密碼的配置文件等等。這個文件的內容是一些規則,Git會根據這些規則來判斷是否將文件添加到版本控制中。
Git忽略文件的原則
- 忽略操作系統自動生成的文件,比如縮略圖等;
- 忽略編譯生成的中間文件、可執行文件等,也就是如果一個文件是通過另一個文件自動生成的,那自動生成的文件就沒必要放進版本庫,比如Java編譯產生的.class文件;
- 忽略你自己的帶有敏感信息的配置文件,比如存放口令的配置文件。
.gitignore文件的使用方法
首先,在你的工作區新建一個名稱爲.gitignore的文件。
然後,把要忽略的文件名填進去,Git就會自動忽略這些文件。
不需要從頭寫.gitignore文件,GitHub已經爲我們準備了各種配置文件,只需要組合一下就可以使用了。
有時對於git項目下的某些文件,我們不需要納入版本控制,比如日誌文件或者IDE的配置文件,此時可以在項目的根目錄下建立一個隱藏文件 .gitignore(linux下以.開頭的文件都是隱藏文件),然後在.gitignore中寫入需要忽略的文件。
1 2 3 4 |
|
.gitignore註釋用'#', *表示匹配0個或多個任意字符,所以上面的模式就是要忽略所有的xml文件,log文件和apk文件。
.gitignore配置文件用於配置不需要加入版本管理的文件,配置好該文件可以爲版本管理帶來很大的便利。
.gitignore忽略規則的優先級
在 .gitingore 文件中,每一行指定一個忽略規則,Git檢查忽略規則的時候有多個來源,它的優先級如下(由高到低):
1)從命令行中讀取可用的忽略規則
2)當前目錄定義的規則
3)父級目錄定義的規則,依次遞推
4)$GIT_DIR/info/exclude 文件中定義的規則
5)core.excludesfile中定義的全局規則
.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忽略規則簡單說明
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 |
|
溫馨提示:
如果你不慎在創建.gitignore文件之前就push了項目,那麼即使你在.gitignore文件中寫入新的過濾規則,這些規則也不會起作用,Git仍然會對所有文件進行版本管理。簡單來說出現這種問題的原因就是Git已經開始管理這些文件了,所以你無法再通過過濾規則過濾它們。所以大家一定要養成在項目開始就創建.gitignore文件的習慣,否則一單push,處理起來會非常麻煩。
.gitignore忽略規則常用示例
1)示例
比如你的項目是java項目,.java文件編譯後會生成.class文件,這些文件多數情況下是不想被傳到倉庫中的文件。這時候你可以直接適用github的.gitignore文件模板。https://github.com/github/gitignore/blob/master/Java.gitignore 將這些忽略文件信息複製到你的.gitignore文件中去:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 |
|
可以看到github爲我們提供了最流行的.gitignore文件配置。保存.ignore文件後我們查看下git status,檢查下是否還有我們不需要的文件會被添加到git中去:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 |
|
比如我的項目目錄下有一個Config.ini文件,這個是個本地配置文件我不希望上傳到git中去,我們可以在gitignore文件中添加這樣的配置:
1 |
|
或者你想忽略所有的.ini文件你可以這樣寫:
1 |
|
如果有些文件已經被你忽略了,當你使用git add時是無法添加的,比如我忽略了*.class,現在我想把HelloWorld.class添加到git中去:
1 2 3 4 |
|
git會提示我們這個文件已經被我們忽略了,需要加上-f
參數才能強制添加到git中去:
1 2 3 4 5 6 7 8 9 10 11 |
|
這樣就能強制添加到緩存中去了。如果我們意外的將想要忽略的文件添加到緩存中去了,我們可以使用rm命令將其從中移除:
1 2 |
|
如果你已經把不想上傳的文件上傳到了git倉庫,那麼你必須先從遠程倉庫刪了它,我們可以從遠程倉庫直接刪除然後pull代碼到本地倉庫這些文件就會本刪除,或者從本地刪除這些文件並且在.gitignore文件中添加這些你想忽略的文件,然後再push到遠程倉庫。
2)示例
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 |
|
3)示例
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 |
|
.gitignor忽略規則查看
如果你發下.gitignore寫得有問題,需要找出來到底哪個規則寫錯了,可以用git check-ignore命令檢查:
1 2 |
|
可以看到HelloWorld.class匹配到了我們的第一條*.class的忽略規則所以文件被忽略了。
簡單來說,要實現過濾掉Git裏不想上傳的文件,如上介紹三種方法能達到這種目的,只不過適用情景不一樣:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 |
|
Git忽略規則(.gitignore配置)不生效原因和解決
1 2 3 4 5 6 7 8 9 10 11 12 13 |
|
在使用.gitignore文件後如何刪除遠程倉庫中以前上傳的此類文件而保留本地文件
在使用git和github的時候,之前沒有寫.gitignore文件,就上傳了一些沒有必要的文件,在添加了.gitignore文件後,就想刪除遠程倉庫中的文件卻想保存本地的文件。這時候不可以直接使用"git rm directory",這樣會刪除本地倉庫的文件。可以使用"git rm -r –cached directory"來刪除緩衝,然後進行"commit"和"push",這樣會發現遠程倉庫中的不必要文件就被刪除了,以後可以直接使用"git add -A"來添加修改的內容,上傳的文件就會受到.gitignore文件的內容約束。
額外說明:git庫所在的文件夾中的文件大致有4種狀態
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 |
|
***************當你發現自己的才華撐不起野心時,就請安靜下來學習吧***************