Git忽略文件


http://cwind.iteye.com/blog/1666646

 

有很多文件不必使用git管理。例如Eclipse或其他IDE生成的項目文件,編譯生成的各種目標或臨時文件等。
使用git status時,會在Untracked files里面看到這些文件列表,
在一次需要添加的文件比較多時(使用git add . / git add -u),會把這些所有的未跟蹤文件添加進索引。 ============一些牢騷============
於是自然想要告訴git把這些文件忽略,我們當然會想到去Google,輸入本文標題這個關鍵字(一部分人會直接去看document),
然后當然會有很多解決方案,多數告訴我們在.gitignore文件中添加待忽略的文件目錄列表;照做,問題很有可能依然存在。
再Google,這次可能找到了help.github.com或stackoverflow上,看到一些原文的討論;
其中講到在向.gitignore添加忽略文件之前一定要保證那些文件未被git跟蹤,

即先使用命令git rm
--cached filename將它們從索引中刪除。

終於看到靠譜的解決方案不禁暗喜,照做--敲一下git status試試,問題很有可能仍然存在。 太多中文“技術資料”是復制照搬過來的,轉載的人自己並沒有試過;
稍好一點的在英文社區看到了相關討論,隨手翻譯了一下發過來,可能存在理解上的問題或者忽略了一些細節,導致依然沒辦法解決問題。 所以搜索引擎給出的中文的結果,有很多對解決問題絲毫無用的。

Git忽略文件是很普遍也應該是很簡單的一個問題,但多數帖子根本連這個問題都沒搞明白,於是引發了這一系列的牢騷。
遇到問題要多思考,想想問題的本質,解決方法的原理;最重要的是要切實地去動手做。
============牢騷結束============ 解決方案:
1. 本地倉庫忽略
本地倉庫的文件忽略規則可以在 .git
/info/exclude 文件中添加。這些忽略的文件不會提交到共享庫中,因而不會被協作者所共享。
# git ls-files --others --exclude-from=.git/info/exclude
# Lines that start with '#' are comments.
# For a project mostly in C, the following would be a good set of
# exclude patterns (uncomment them if you want to use them):
# *.[oa]
# *~
2. 當前工作目錄添加文件忽略
對於每一級工作目錄,創建一個.gitignore文件,向該文件中添加要忽略的文件或目錄。
但在創建並編輯這個文件之前,一定要保證要忽略的文件沒有添加到git索引中。
使用命令git rm
--cached filename將要忽略的文件從索引中刪除。
--摘抄.gitignore的格式規范
• 所有空行或者以注釋符號 # 開頭的行都會被 Git 忽略。 • 可以使用標准的 glob 模式匹配。 • 匹配模式最后跟反斜杠(
/)說明要忽略的是目錄。 • 要忽略指定模式以外的文件或目錄,可以在模式前加上驚嘆號(!)取反。
所謂的 glob 模式是指 shell 所使用的簡化了的正則表達式。
星號(
*)匹配零個或多個任意字符;
[abc] 匹配任何一個列在方括號中的字符(這個例子要么匹配一個 a,要么匹配一個 b,要么匹配一個 c);
問號(?)只匹配一個任意字符;
如果在方括號中使用短划線分隔兩個字符,表示所有在這兩個字符范圍內的都可以匹配(比如[0-9]表示匹配所有 0 到 9 的數字)。
2.1 工作目錄的每一層下級目錄都可以有一個.gitignore文件,以說明當前目錄下需要被git忽略的文件或目錄 2.2 .gitignore文件 可以被提交到共享庫中被協作者共享 3. 全局的.gitignore
可以通過創建
~/.gitignore_global並添加到git全局配置以減少每層目錄的規則重復定義。
使用命令git config --global core.excludesfile ~/.gitignore_global 即可
.gitignore_global文件范例
# Compiled source # ###################  
*.com  
*.class  
*.dll  
*.exe  
*.o  
*.so  
  
# Packages # ############ # it's better to unpack these files and commit the raw source  
# git has its own built in compression methods  
*.7z  
*.dmg  
*.gz  
*.iso  
*.jar  
*.rar  
*.tar  
*.zip  
 # Logs and databases # ######################  
*.log  
*.sql  
*.sqlite  
 # OS generated files # ######################  
.DS_Store  
.DS_Store?  
._*  
.Spotlight-V100  
.Trashes  
Icon?  
ehthumbs.db  
Thumbs.db  
文件 .gitignore 的格式規范如下:

• 所有空行或者以注釋符號 # 開頭的行都會被 Git 忽略。
• 可以使用標准的 glob 模式匹配。
• 匹配模式最后跟反斜杠(/)說明要忽略的是目錄。
• 要忽略指定模式以外的文件或目錄,可以在模式前加上驚嘆號(!)取反。
所謂的 glob 模式是指 shell 所使用的簡化了的正則表達式。
星號(
*)匹配零個或多個任意字符;
[abc] 匹配任何一個列在方括號中的字符(這個例子要么匹配一個 a,要么匹配一個 b,要么匹配一個 c);
問號(?)只匹配一個任意字符;
如果在方括號中使用短划線分隔兩個字符,表示所有在這兩個字符范圍內的都可以匹配(比如[0-9]表示匹配所有 09 的數字)。
我們再看一個 .gitignore 文件的例子:
# 此為注釋 – 將被 Git 忽略
*.a # 忽略所有 .a 結尾的文件 !lib.a # 但 lib.a 除外 /TODO # 僅僅忽略項目根目錄下的 TODO 文件,不包括 subdir/TODO build/ # 忽略 build/ 目錄下的所有文件 doc/*.txt # 會忽略 doc/notes.txt 但不包括 doc/server/arch.txt

Two things to keep in mind with ignoring files:

First, if a file is already being tracked by Git, adding the file to .gitignore won’t stop Git from tracking it.

You’ll need to do git rm --cached <file> to keep the file in your tree and then ignore it.

Secondly, empty directories do not get tracked by Git.

If you want them to be tracked, they need to have something in them.
Usually doing a touch .gitignore is enough to keep the folder tracked.

You can also open up $GIT_DIR/info/exclude ($GIT_DIR is usually your .git folder) and edit that file for project-only ignores.
The problem with this is that those changes aren’t checked in,
so use this only if you have some personal files that don’t need to be shared with others on the same project.

Your final option with ignoring folders is adding a per-user ignore by setting up acore.excludesfiles option in your config file.
You can set up a .gitignore file in yourHOME directory that will affect all of your repositories by running this command:

git config --global core.excludesfile ~/.gitignore

Read up on the manpage if you’d like to learn more about how ignores work.
As always, if you have other ignore-related tips let us know in the comments.

 

 

git忽略文件有三種:


1、全局范圍內有效的忽略文件

就是"版本庫根目錄/.git/info/exclude",全局范圍內的所有忽略規則都以行為單位寫在這個文件中;


2、局部范圍內有效的忽略文件

就是.gitignore,這個忽略文件只對某一級目錄下的文件的忽略有效;
如果某一個目錄下有需要被忽略的文件,那么就可以在該目錄下手工地創建忽略文件.gitignore,
並在這個忽略文件中寫上忽略規則,以行為單位,一條規則占據一行;
比較特殊的情況就是在版本庫的根目錄下創建一個忽略文件.gitignore,這時,
這個.gitignore忽略文件就對版本庫根目錄下的文件有效,等價於全局范圍內的忽略文件.git/info/exclude;


3、手工指定一個忽略文件,

該忽略文件中的規則和語法與前兩種是一致的,隨便哪一級目錄都可以,只要加上對應的路徑即可;
   手工指定忽略文件的命令是:
   git config --global core.excludesfile /path/to/.gitignore
   然后手工地在對應位置創建忽略文件.gitignore,並在該文件中寫入忽略規則即可;


備注:
這三種范圍級別的忽略文件的內容格式和語法都是一致的;

 

.gitignor文件同樣可以像其它文件一樣加到項目倉庫里( 直接用 git add .gitignore 和 git commit等命令), 

這樣項目里的其它開發者也能共享同一套忽略 文件規則。

 

如果想要連.gitignore文件自己也忽略呢?一樣的道理,只要在文件內加上.gitignore即可。

 

如果你想忽略規則只對特定的倉庫起作用,你可以把這些忽略規則寫到你的倉庫下

 

.git/info/exclude 文件中,或是寫在Git配置變量

 

core.excludesfile 中指定的 文件里。

 

有些Git命令也可在命令行參數中指定忽略規則,你可以在這里:gitignore 查看詳細的用法。

 

github中不加入版本控制.gitignore設定
JAN 19TH, 2012
這幾天研究github page,由於用jekyll本地測試時會生成_site文件夾,
所以需要把這個文件夾排除在外再提交到github,到底怎么設置呢?

這就需要用到.gitignore,即不加入版本控制,在git根目錄下建立.gitignore,具體設定如下:

tmp.txt         //忽略tmp.txt
*.log           //忽略所有log文件
tmp/*           //忽略tmp文件夾所有文件
log/**/*.log    //忽略log目錄下的包括子目錄下的所有log文件
其他的一些過濾條件

?:代表任意的一個字符
*:代表任意數目的字符
{!ab}:必須不是此類型
{ab,bb,cx}:代表ab,bb,cx中任一類型即可
[abc]:代表a,b,c中任一字符即可
[ ^abc]:代表必須不是a,b,c中任一字符
由於git不會加入空目錄,所以下面做法會導致tmp不會存在

tmp/*             //忽略tmp文件夾所有文件
改下方法,在tmp下也加一個.gitignore,內容為

*
!.gitignore
還有一種情況,就是已經commit了,再加入gitignore是無效的,所以需要刪除下緩存

git rm --cached ignore_file
這樣就OK了。

 

 


免責聲明!

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



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