Git忽略文件

有很多文件不必使用git管理。例如Eclipse或其他IDE生成的項(xiàng)目文件,編譯生成的各種目標(biāo)或臨時(shí)文件等。

使用git status時(shí),會(huì)在Untracked files里面看到這些文件列表,

在一次需要添加的文件比較多時(shí)(使用git add . / git add -u),會(huì)把這些所有的未跟蹤文件添加進(jìn)索引。============一些牢騷============

于是自然想要告訴git把這些文件忽略,我們當(dāng)然會(huì)想到去Google,輸入本文標(biāo)題這個(gè)關(guān)鍵字(一部分人會(huì)直接去看document),

然后當(dāng)然會(huì)有很多解決方案,多數(shù)告訴我們?cè)?gitignore文件中添加待忽略的文件目錄列表;照做,問題很有可能依然存在。

再Google,這次可能找到了help.github.com或stackoverflow上,看到一些原文的討論;

其中講到在向.gitignore添加忽略文件之前一定要保證那些文件未被git跟蹤,

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

終于看到靠譜的解決方案不禁暗喜,照做--敲一下git status試試,問題很有可能仍然存在。太多中文“技術(shù)資料”是復(fù)制照搬過來的,轉(zhuǎn)載的人自己并沒有試過;

稍好一點(diǎn)的在英文社區(qū)看到了相關(guān)討論,隨手翻譯了一下發(fā)過來,可能存在理解上的問題或者忽略了一些細(xì)節(jié),導(dǎo)致依然沒辦法解決問題。所以搜索引擎給出的中文的結(jié)果,有很多對(duì)解決問題絲毫無用的。

Git忽略文件是很普遍也應(yīng)該是很簡(jiǎn)單的一個(gè)問題,但多數(shù)帖子根本連這個(gè)問題都沒搞明白,于是引發(fā)了這一系列的牢騷。

遇到問題要多思考,想想問題的本質(zhì),解決方法的原理;最重要的是要切實(shí)地去動(dòng)手做。

============牢騷結(jié)束============解決方案:

1. 本地倉庫忽略

本地倉庫的文件忽略規(guī)則可以在.git/info/exclude文件中添加。這些忽略的文件不會(huì)提交到共享庫中,因而不會(huì)被協(xié)作者所共享。

# 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. 當(dāng)前工作目錄添加文件忽略

對(duì)于每一級(jí)工作目錄,創(chuàng)建一個(gè).gitignore文件,向該文件中添加要忽略的文件或目錄。

但在創(chuàng)建并編輯這個(gè)文件之前,一定要保證要忽略的文件沒有添加到git索引中。

使用命令git rm--cached filename將要忽略的文件從索引中刪除。

--摘抄.gitignore的格式規(guī)范

? 所有空行或者以注釋符號(hào) # 開頭的行都會(huì)被 Git 忽略。? 可以使用標(biāo)準(zhǔn)的 glob 模式匹配。? 匹配模式最后跟反斜杠(/)說明要忽略的是目錄。

? 要忽略指定模式以外的文件或目錄,可以在模式前加上驚嘆號(hào)(!)取反。

所謂的 glob 模式是指 shell 所使用的簡(jiǎn)化了的正則表達(dá)式。

星號(hào)(*)匹配零個(gè)或多個(gè)任意字符;

[abc] 匹配任何一個(gè)列在方括號(hào)中的字符(這個(gè)例子要么匹配一個(gè) a,要么匹配一個(gè) b,要么匹配一個(gè) c);

問號(hào)(?)只匹配一個(gè)任意字符;

如果在方括號(hào)中使用短劃線分隔兩個(gè)字符,表示所有在這兩個(gè)字符范圍內(nèi)的都可以匹配(比如[0-9]表示匹配所有 0 到 9 的數(shù)字)。

2.1工作目錄的每一層下級(jí)目錄都可以有一個(gè).gitignore文件,以說明當(dāng)前目錄下需要被git忽略的文件或目錄2.2.gitignore文件可以被提交到共享庫中被協(xié)作者共享3. 全局的.gitignore

可以通過創(chuàng)建~/.gitignore_global并添加到git全局配置以減少每層目錄的規(guī)則重復(fù)定義。

使用命令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 incompression 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 的格式規(guī)范如下:

? 所有空行或者以注釋符號(hào) # 開頭的行都會(huì)被 Git 忽略。

? 可以使用標(biāo)準(zhǔn)的 glob 模式匹配。

? 匹配模式最后跟反斜杠(/)說明要忽略的是目錄。

? 要忽略指定模式以外的文件或目錄,可以在模式前加上驚嘆號(hào)(!)取反。

所謂的 glob 模式是指 shell 所使用的簡(jiǎn)化了的正則表達(dá)式。

星號(hào)(*)匹配零個(gè)或多個(gè)任意字符;

[abc] 匹配任何一個(gè)列在方括號(hào)中的字符(這個(gè)例子要么匹配一個(gè) a,要么匹配一個(gè) b,要么匹配一個(gè) c);

問號(hào)(?)只匹配一個(gè)任意字符;

如果在方括號(hào)中使用短劃線分隔兩個(gè)字符,表示所有在這兩個(gè)字符范圍內(nèi)的都可以匹配(比如[0-9]表示匹配所有0到9的數(shù)字)。

我們?cè)倏匆粋€(gè) .gitignore 文件的例子:

# 此為注釋 – 將被 Git 忽略*.a # 忽略所有 .a 結(jié)尾的文件!lib.a # 但 lib.a 除外/TODO # 僅僅忽略項(xiàng)目根目錄下的 TODO 文件,不包括 subdir/TODO

build/ # 忽略 build/目錄下的所有文件

doc/*.txt # 會(huì)忽略 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.gitignorewon’t stop Git from tracking it.

You’ll need to dogit rm --cached 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 atouch .gitignoreis enough to keep the folder tracked.

You can also open up$GIT_DIR/info/exclude($GIT_DIRis usually your.gitfolder) 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.excludesfilesoption in your config file.

You can set up a.gitignorefile in yourHOMEdirectory that will affect all of your repositories by running this command:

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

Read up on themanpageif 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、全局范圍內(nèi)有效的忽略文件

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

2、局部范圍內(nèi)有效的忽略文件

就是.gitignore,這個(gè)忽略文件只對(duì)某一級(jí)目錄下的文件的忽略有效;

如果某一個(gè)目錄下有需要被忽略的文件,那么就可以在該目錄下手工地創(chuàng)建忽略文件.gitignore,

并在這個(gè)忽略文件中寫上忽略規(guī)則,以行為單位,一條規(guī)則占據(jù)一行;

比較特殊的情況就是在版本庫的根目錄下創(chuàng)建一個(gè)忽略文件.gitignore,這時(shí),

這個(gè).gitignore忽略文件就對(duì)版本庫根目錄下的文件有效,等價(jià)于全局范圍內(nèi)的忽略文件.git/info/exclude;

3、手工指定一個(gè)忽略文件,

該忽略文件中的規(guī)則和語法與前兩種是一致的,隨便哪一級(jí)目錄都可以,只要加上對(duì)應(yīng)的路徑即可;

手工指定忽略文件的命令是:

git config --global core.excludesfile /path/to/.gitignore

然后手工地在對(duì)應(yīng)位置創(chuàng)建忽略文件.gitignore,并在該文件中寫入忽略規(guī)則即可;

備注:

這三種范圍級(jí)別的忽略文件的內(nèi)容格式和語法都是一致的;

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

這樣項(xiàng)目里的其它開發(fā)者也能共享同一套忽略 文件規(guī)則。

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

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

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

core.excludesfile 中指定的 文件里。

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

github中不加入版本控制.gitignore設(shè)定

JAN 19TH,2012這幾天研究github page,由于用jekyll本地測(cè)試時(shí)會(huì)生成_site文件夾,

所以需要把這個(gè)文件夾排除在外再提交到github,到底怎么設(shè)置呢?

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

tmp.txt//忽略tmp.txt*.log//忽略所有l(wèi)og文件tmp/*//忽略tmp文件夾所有文件

log/**/*.log//忽略log目錄下的包括子目錄下的所有l(wèi)og文件其他的一些過濾條件

?:代表任意的一個(gè)字符

*:代表任意數(shù)目的字符

{!ab}:必須不是此類型

{ab,bb,cx}:代表ab,bb,cx中任一類型即可

[abc]:代表a,b,c中任一字符即可

[^abc]:代表必須不是a,b,c中任一字符

由于git不會(huì)加入空目錄,所以下面做法會(huì)導(dǎo)致tmp不會(huì)存在

tmp/*//忽略tmp文件夾所有文件

改下方法,在tmp下也加一個(gè).gitignore,內(nèi)容為

*

!.gitignore

還有一種情況,就是已經(jīng)commit了,再加入gitignore是無效的,所以需要?jiǎng)h除下緩存

git rm --cached ignore_file

這樣就OK了。

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時(shí)請(qǐng)結(jié)合常識(shí)與多方信息審慎甄別。
平臺(tái)聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點(diǎn),簡(jiǎn)書系信息發(fā)布平臺(tái),僅提供信息存儲(chǔ)服務(wù)。

相關(guān)閱讀更多精彩內(nèi)容

友情鏈接更多精彩內(nèi)容