Git學習之忽略特殊文件.gitignore的配置


1.Mac中使用Git上傳項目代碼時忽略.DS_Store文件

簡單的說Mac每個目錄都會有個文件叫.DS_Store,它是用於存儲當前文件夾的一些Meta信息。所以每次查看Git目錄的狀態,如果沒有add這個.DS_Store文件,會有Untracked files:的提示,add了它,又會常有Changes not staged for commit:的提示,要解決這個煩人的小妖精,我們需要用到.gitignore文件去配置Git目錄中需要忽略的文件。

  1. touch .gitigonre若當前文件夾下有這個文件就不用在創建了

  2. 編輯內容:

  3. 保存退出,萬事大吉

2..gitigonre文件語法與規則

忽略文件的原則是:

  • 忽略操作系統自動生成的文件,比如縮略圖等;
  • 忽略編譯生成的中間文件、可執行文件等,也就是如果一個文件是通過另一個文件自動生成的,那自動生成的文件就沒必要放進版本庫,比如Java編譯產生的.class文件;
  • 忽略你自己的帶有敏感信息的配置文件,比如存放口令的配置文件。

舉個例子:
假設你在Windows下進行Python開發,Windows會自動在有圖片的目錄下生成隱藏的縮略圖文件,如果有自定義目錄,目錄下就會有Desktop.ini文件,因此你需要忽略Windows自動生成的垃圾文件:

# Windows:
Thumbs.db
ehthumbs.db
Desktop.ini

然后,繼續忽略Python編譯產生的.pyc.pyodist等文件或目錄:

# Python:
*.py[cod]
*.so
*.egg
*.egg-info
dist
build

加上你自己定義的文件,最終得到一個完整的.gitignore文件,內容如下:

# Windows:
Thumbs.db
ehthumbs.db
Desktop.ini

# Python:
*.py[cod]
*.so
*.egg
*.egg-info
dist
build

# My configurations:
db.ini
deploy_key_rsa

有些時候,你想添加一個文件到Git,但發現添加不了,原因是這個文件被.gitignore忽略了:

$ git add App.class
The following paths are ignored by one of your .gitignore files:
App.class
Use -f if you really want to add them.

如果你確實想添加該文件,可以用-f強制添加到Git:

``$ git add -f App.class

或者你發現,可能是.gitignore寫得有問題,需要找出來到底哪個規則寫錯了,可以用git check-ignore命令檢查:

$ git check-ignore -v App.class
.gitignore:3:*.class    App.class

Git會告訴我們,.gitignore的第3行規則忽略了該文件,於是我們就可以知道應該修訂哪個規則。

忽略某些文件時,需要編寫.gitignore
.gitignore文件本身要放到版本庫里,並且可以對.gitignore做版本管理!

1).gitignore忽略規則的優先級

.gitingore 文件中,每一行指定一個忽略規則,Git檢查忽略規則的時候有多個來源,它的優先級如下(由高到低):

1)從命令行中讀取可用的忽略規則
2)當前目錄定義的規則
3)父級目錄定義的規則,依次遞推
4)$GIT_DIR/info/exclude 文件中定義的規則
5)core.excludesfile中定義的全局規則

2).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配置文件是按行從上到下進行規則匹配的,意味着如果前面的規則匹配的范圍更大,則后面的規則將不會生效;

3.全局的.gitignore

可以通過創建~/.gitignore_global並添加到git全局配置以減少每層目錄的規則重復定義。使用命令git config --global core.excludesfile ~/.gitignore_global即可

Mac下.gitignore_global文件范例

# for Mac OS X System Files
.DS_Store
Thumbs.db
 
# for emacs
*~
[#]*[#]
 
# for Eclipse
*.project
 
# for Logs and databases
*.log
 
# remove SVN
.svn
 
# for Xcode
.*.swp
.clang_complete
*.xcodeproj/project.xcworkspace/
*.xcodeproj/xcuserdata/
 
# for IDEA
*/build/*
.idea/*
*.iml
/out/*

# Python的忽略文件
# Byte-compiled / optimized / DLL files
__pycache__/
*.py[cod]
*$py.class

# C extensions
*.so

# Distribution / packaging
.Python
build/
develop-eggs/
dist/
downloads/
eggs/
.eggs/
lib/
lib64/
parts/
sdist/
var/
wheels/
pip-wheel-metadata/
share/python-wheels/
*.egg-info/
.installed.cfg
*.egg
MANIFEST

# PyInstaller
#  Usually these files are written by a python script from a template
#  before PyInstaller builds the exe, so as to inject date/other infos into it.
*.manifest
*.spec

# Installer logs
pip-log.txt
pip-delete-this-directory.txt

# Unit test / coverage reports
htmlcov/
.tox/
.nox/
.coverage
.coverage.*
.cache
nosetests.xml
coverage.xml
*.cover
.hypothesis/
.pytest_cache/

# Translations
*.mo
*.pot

# Django stuff:
*.log
local_settings.py
db.sqlite3

# Flask stuff:
instance/
.webassets-cache

# Scrapy stuff:
.scrapy

# Sphinx documentation
docs/_build/

# PyBuilder
target/

# Jupyter Notebook
.ipynb_checkpoints

# IPython
profile_default/
ipython_config.py

# pyenv
.python-version

# pipenv
#   According to pypa/pipenv#598, it is recommended to include Pipfile.lock in version control.
#   However, in case of collaboration, if having platform-specific dependencies or dependencies
#   having no cross-platform support, pipenv may install dependencies that don’t work, or not
#   install all needed dependencies.
#Pipfile.lock

# celery beat schedule file
celerybeat-schedule

# SageMath parsed files
*.sage.py

# Environments
.env
.venv
env/
venv/
ENV/
env.bak/
venv.bak/

# Spyder project settings
.spyderproject
.spyproject

# Rope project settings
.ropeproject

# mkdocs documentation
/site

# mypy
.mypy_cache/
.dmypy.json
dmypy.json

# Pyre type checker
.pyre/

4.刪除GitHub上已提交的文件

有時候在 .gitignore 文件中添加規則並未生效,原因是 .gitignore 只能忽略原來沒有被 track 的文件,如果某些文件已經加入了版本管理中,修改 .gitignore 是無效的。解決方法:先把不想記錄文件的本地緩存刪除,再在 .gitignore 中添加忽略該文件,然后再提交。

$ git pull origin master #先將遠程倉庫里面的項目拉下來

# 清除本地緩存(改變成未track狀態)
git rm -r --cached . #表示清除項目中所有文件的本地緩存
git rm -r --cached xxx    #xxx表示不想版本控制的文件
git add .   #添加除了忽略文件外的所有文件
git commit -m "此處可以描述你提交的信息"
git push -f #強制推送


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM