Git的忽略提交規則
相關知識參考資料:
-
https://git-scm.com/book/zh/v2/Git-基礎-記錄��% 8F%E6%AC%A1%E6%9B%B4%E6%96%B0%E5%88%B0%E4%BB%93%E5%BA%93(推薦)
-
https://blog.csdn.net/killsamaritan/article/details/53510999
以下怕看著亂的話看另外一個文章,單獨列出來了:git忽略提交規則
的.gitignore只會對沒有被跟蹤的,即沒有被新增的檔案進行忽略。
的.gitignore的檔案使用方法
首先,在你的工作區新建一個名稱為的.gitignore的檔案。
然後,把要忽略的檔名填進去,GIT中就會自動忽略這些檔案。
不需要從頭寫的.gitignore檔案,GitHub的已經為我們準備了各種配置檔案,只需要組合一下就可以使用了。
有時對於git專案下的某些檔案,我們不需要納入版本控制,比如日誌檔案或者IDE的配置檔案,此時可以在專案的根目錄下建立一個隱藏檔案.gitignore(linux下以。開頭的檔案都是隱藏檔案),然後在的.gitignore中寫入需要忽略的檔案。
[[email protected] ~]# cat .gitignore
*.xml
*.log
*.apk
.gitignore註釋用’#’,*表示匹配0個或多個任意字元,所以上面的模式就是要忽略所有的xml檔案,日誌檔案和apk檔案。
的.gitignore配置檔案用於配置不需要加入版本管理的檔案,配置好該檔案可以為版本管理帶來很大的便利。
的.gitignore規則忽略優先的級
在.gitingore檔案中,每一行指定一個忽略規則,GIT中檢查忽略規則的時候有多個來源,它的優先順序如下(由高到低):
1)從命令列中讀取可用的忽略規則
2)當前目錄定義的規則
3)父級目錄定義的規則,依次遞推
4)$ GIT_DIR / info / exclude檔案中定義的規則
5)core.excludesfile中定義的全域性規則
.gitignore忽略規則的匹配語法
在.gitignore檔案中,每一行的忽略規則的語法如下:
1)空格不匹配任意檔案,可作為分隔符,可用反斜槓轉義
2)以“ # ”開頭的行都會被GIT中忽略。即#開頭的檔案標識註釋,可以使用反斜槓進行轉義。
3)可以使用標準的水珠模式匹配。所謂的圓頂封裝模式是指殼所使用的簡化了的正則表示式。
4 )以斜槓“ / ” 開頭表示目錄;“/”結束的模式只匹配資料夾以及在該資料夾路徑下的內容,但是不匹配該檔案;“/”開始的模式匹配專案跟目錄;如果一個模式不包含斜槓,則它匹配相對於當前.gitignore檔案路徑的內容,如果該模式不在.gitignore檔案中,則相對於專案根目錄
.5)以星號“ * ”通配多個字元,即匹配多個任意字元;使用兩個星號“ ** ”表示匹配任意中間目錄,比如a / ** / z
6)以問號“ ? ”通配單個 符,即匹配一個任意字元;
7)以方括號” []“包含單個字元的匹配列表,即匹配任何一個列在方括號中的字元比如[ABC]表示要麼匹配一個一個,要麼匹配一個B,要麼匹配一個C。;如果在方括號中使用短劃線分隔兩個字元,表示所有在這兩個字元範圍內的都可以匹配。比如[0-9]表示匹配所有0到9的數字,[az]表示匹配任意的小寫字母)
.8)以歎號“ !“表示不忽略(跟蹤)匹配到的檔案或目錄,即要忽略指定模式以外的檔案或目錄,可以在模式前加上驚歎號取反需要特別注意的是(!):如果檔案的父目錄已經被前面的規則排除掉了,那麼對這個檔案用! “”規則是不起作用的。也就是說“!”開頭的模式表示否定,該檔案將會再次被包含,如果排除了該檔案的父級目錄,則使用“!”也不會再次被包含。可以使用反斜槓進行轉義。
需要謹記:混帳對於.IGNORE配置檔案是按行從上到下進行規則匹配的,意味著如果前面的規則匹配的範圍更大,則後面的規則將不會生效。
混帳忽略規則(的.gitignore配置)不生效原因和解決
.gitignore中已經標明忽略的檔案目錄下的檔案,git push的時候還會出現在push的目錄中,或者用git status檢視狀態,想要忽略的檔案還是顯示被追蹤狀態。
原因是因為在git忽略目錄中,新建的檔案在git中會有快取,如果某些檔案已經被納入了版本管理中,就算是在.gitignore中已經聲明瞭忽略路徑也是不起作用的,
這時候我們就應該先把本地快取刪除,然後再進行git的push,這樣就不會出現忽略的檔案了。
解決方法:git清除本地快取(改變成未track狀態),然後再提交:
[[email protected] ~]# git rm -r --cached .
[[email protected] ~]# git add .
[[email protected] ~]# git commit -m ‘update .gitignore’
需要特別注意的是:
1).gitignore只能忽略那些原來沒有被track的檔案,如果某些檔案已經被納入了版本管理中,則修改.gitignore是無效的。
2)想要.gitignore起作用,必須要在這些檔案不在暫存區中才可以,.gitignore檔案只是忽略沒有被staged(cached)檔案,
對於已經被staged檔案,加入ignore檔案時一定要先從staged移除,才可以忽略。
在使用的.gitignore後文件刪除如何遠端倉庫中以前上傳的此類檔案而保留本地檔案
在使用的git和github上的時候,之前沒有寫的.gitignore檔案,就上傳了一些沒有必要的檔案,在添加了的.gitignore檔案後,就想刪除遠端倉庫中的檔案卻想儲存本地的檔案。這時候不可以直接使用“git rm directory”,這樣會刪除本地倉庫的檔案。可以使用“ git rm -r -cached directory ”來刪除緩衝,然後進行“ commit ”和“ push ”,這樣會發現遠端倉庫中的不必要檔案就被刪除了,以後可以直接使用“ git add -A ”來新增修改的內容,上傳的檔案就會受到的.gitignore檔案的內容約束。
額外說明:git庫所在的資料夾中的檔案大致有4種狀態
Untracked:
未跟蹤, 此檔案在資料夾中, 但並沒有加入到git庫, 不參與版本控制. 通過git add 狀態變為Staged.
Unmodify:
檔案已經入庫, 未修改, 即版本庫中的檔案快照內容與資料夾中完全一致. 這種型別的檔案有兩種去處, 如果它被修改,
而變為Modified. 如果使用git rm移出版本庫, 則成為Untracked檔案
Modified:
檔案已修改, 僅僅是修改, 並沒有進行其他的操作. 這個檔案也有兩個去處, 通過git add可進入暫存staged狀態,
使用git checkout 則丟棄修改過, 返回到unmodify狀態, 這個git checkout即從庫中取出檔案, 覆蓋當前修改
Staged:
暫存狀態. 執行git commit則將修改同步到庫中, 這時庫中的檔案和本地檔案又變為一致, 檔案為Unmodify狀態.
執行git reset HEAD filename取消暫存, 檔案狀態為Modified
Git 狀態 untracked 和 not staged的區別
1)untrack 表示是新檔案,沒有被add過,是為跟蹤的意思。
2)not staged 表示add過的檔案,即跟蹤檔案,再次修改沒有add,就是沒有暫存的意思