手把手帶你玩git之gitignore

內(nèi)容提要

  • 忽略文件
  • 忽略目錄的四種不同方式
  • /mytmp
  • /mytmp/*
  • **/mytmp
  • **/mytmp/*
  • 例外
  • ! 表示例外挚赊;
  • 作用于/mytmp/*突雪,不能作用于/mytmp
  • ignore 生效的前提
  • 通配符語法
  • 一個星表示任意字符交播;
  • 兩個星表示任意路徑摔敛。
  • 兩種形式:共享式和獨(dú)享式
  • 官方模板

語法

當(dāng)我們進(jìn)行代碼開發(fā)時,把代碼存到遠(yuǎn)程代碼庫上掷漱。但是總有一些代碼是不需要上傳的粘室,比如編譯的中間文件,單元測試自動生成的測試報告等卜范。這個時候我們需要告訴git衔统,哪些文件應(yīng)該忽略,git提供了這種機(jī)制海雪,它通過.gitignore 配置文件來實(shí)現(xiàn)锦爵。通常該文件放在項(xiàng)目的根目錄下,我們可以手動創(chuàng)建它奥裸,然后編輯內(nèi)容险掀。

忽略文件

.gitignore文件中編輯:

#.gitignore for java
*.class

第一行以#開頭的是注釋,*.class 表示忽略“所有”以.class為后綴的文件(其中*號表示glob模式匹配的通配符)湾宙。這里的“所有”無論它在哪個目錄下樟氢。

實(shí)驗(yàn)驗(yàn)證下,創(chuàng)建多級子目錄创倔,每個目錄創(chuàng)建一個.class文件嗡害,結(jié)構(gòu)如下:

?  demo-gitignore git:(master) tree
.
├── L1.class
└── child1
    ├── L2.class
    └── child2
        ├── L3.class
        └── child3
            └── L4.class

3 directories, 4 files

執(zhí)行git status,看看有沒有被忽略畦攘?

?  demo-gitignore git:(master) git status
On branch master
Initial commit
nothing to commit (create/copy files and use "git add" to track)

當(dāng)然也可以不用通配符,例如

# project specified gitignore
Hello.xml

表示忽略“所有”名字叫Hello.xml的文件十电。

忽略目錄

語法上知押,以/開頭的表示忽略目錄。比如/mytmp表示忽略“根目錄下”名叫mytmp的目錄鹃骂,并非表示“所有”台盯。

在上述3個childX目錄下,各自創(chuàng)建一個mytmp子目錄(實(shí)驗(yàn)時請勿用tmp畏线,以免用戶目錄下的~/.gitignore已經(jīng)配置過忽略tmp)静盅,并在每個mytmp目錄下創(chuàng)建Hello.xml文件(因?yàn)槿绻麤]有文件,git不會理會空目錄的)。

形如:

demo-gitignore
├── child1
│   ├── child2
│   │   ├── child3
│   │   │   └── mytmp
│   │   │       └── Hello.xml
│   │   └── mytmp
│   │       └── Hello.xml
│   └── mytmp
│       └── Hello.xml
└── mytmp
    └── Hello.xml

?  demo-gitignore git:(master) ? git status -s
?? child1/
?? mytmp/

.gitignore中添加/mytmp忽略后蒿叠,再看status:

?  demo-gitignore git:(master) ? git status -s
 M .gitignore
?? child1/

首先發(fā)現(xiàn)?? mytmp/已經(jīng)不見了(被忽略了)明垢。第一行.gitignore的變化是因?yàn)閯偺砑?code>/mytmp,尚未提交市咽;第二行?? child1/為什么還在痊银?因?yàn)槲覀冎皇呛雎粤?code>/mytmp目錄,并沒有忽略其下的文件Hello.xml施绎?其實(shí)是只忽略根目錄下的/mytmp溯革,子目錄下的/mytmp并不被忽略。

?  demo-gitignore git:(master) ? git add child1
?  demo-gitignore git:(master) ? git status -s
 M .gitignore
A  child1/child2/child3/mytmp/Hello.xml
A  child1/child2/mytmp/Hello.xml
A  child1/mytmp/Hello.xml

上述唯獨(dú)沒有提到根目錄demo-gitignore下的mytmp目錄谷醉。如果要讓所有目錄下的mytmp目錄都被忽略呢致稀? 前綴加兩個*號(即:**)。

# project specified gitignore
**/mytmp

此時mytmp,都不再顯示帘靡,無論是哪級子目錄:

?  demo-gitignore git:(master) ? git status -s
 M .gitignore

如果我們要“排除(不忽略)” /child1/child2/mytmp 目錄呢斧蜕?
!/child1/child2/mytmp排除。

# project specified gitignore
**/mytmp
!/child1/child2/mytmp

結(jié)果驗(yàn)證如下:

?  demo-gitignore git:(master) ? git status -s
 M .gitignore
A  child1/child2/mytmp/Hello.xml

總結(jié)備忘

/開頭忽略目錄臭猜,表示當(dāng)前。例如/mytmp表示忽略根目錄下的mytmp押蚤。
**/開頭蔑歌,忽略所有目錄。例如**/mytmp表示忽略所有層級下的mytmp目錄揽碘。
!開頭表示例外次屠。例如!/child1/child2/mytmp表示單獨(dú)強(qiáng)調(diào)“不忽略”/child1/child2/mytmp的 mytmp 目錄。

忽略的例外

如前文所說雳刺,例外用!表示劫灶。這里補(bǔ)充下關(guān)于“文件”的例外。在上述的實(shí)驗(yàn)環(huán)境中掖桦,新創(chuàng)建文件 demo-gitignore/mytmp/HelloExpectional.xml本昏,并配置.gitignore如下:

# project specified gitignore
/mytmp/*
!/mytmp/HelloExpectional.xml

它表示忽略根目錄/下的mytmp子目錄下的所有文件(星號表示),但是/mytmp/HelloExpectional.xml文件例外(不忽略)枪汪。

?  demo-gitignore git:(master) ? git add .
?  demo-gitignore git:(master) ? git status
On branch master
Changes to be committed:
  (use "git reset HEAD <file>..." to unstage)

    modified:   .gitignore
    new file:   child1/child2/child3/mytmp/Hello.xml
    new file:   child1/child2/mytmp/Hello.xml
    new file:   child1/mytmp/Hello.xml
    new file:   mytmp/HelloExpectional.xml

如上結(jié)果涌穆,只有mytmp/Hello.xml被忽略。如預(yù)期雀久。如果要所有mytmp呢宿稀?用**/tmp呀。

為什么ignore 沒生效赖捌?

緊接著上面祝沸,把.gitignore內(nèi)容修改為:

# project specified gitignore
**/mytmp/*
!/mytmp/HelloExpectional.xml

查看status,發(fā)現(xiàn)并沒有變化?

?  demo-gitignore git:(master) ? git status -s
MM .gitignore
A  child1/child2/child3/mytmp/Hello.xml
A  child1/child2/mytmp/Hello.xml
A  child1/mytmp/Hello.xml
A  mytmp/HelloExpectional.xml

預(yù)期應(yīng)該是只有mytmp/HelloExceptional.xml不被忽略罩锐,其他均被忽略奉狈。新配置為什么沒生效?因?yàn)榍拔?code>git add .的時候唯欣,已經(jīng)加入git索引了嘹吨,gitignore只能對untracked狀態(tài)的資源起作用。

先把他們從tracked (to be committed) 中撤掉:

?  demo-gitignore git:(master) ? git rm --cached -r child1
rm 'child1/child2/child3/mytmp/Hello.xml'
rm 'child1/child2/mytmp/Hello.xml'
rm 'child1/mytmp/Hello.xml'
?  demo-gitignore git:(master) ? git rm --cached -r mytmp
rm 'mytmp/HelloExpectional.xml'
?  demo-gitignore git:(master) ?

命令解釋如下:

git rm --cached 表示直接刪除“索引區(qū)”的內(nèi)容(不是導(dǎo)出到Working dir境氢,也不是提交到版本庫)蟀拷。后面接文件,表示操作對象萍聊;-r是當(dāng)操作對象為目錄時问芬,表示遞歸。

接著實(shí)驗(yàn)看看新的ignore規(guī)則:

?  demo-gitignore git:(master) ? git add .
?  demo-gitignore git:(master) ? git status
On branch master
Changes to be committed:
  (use "git reset HEAD <file>..." to unstage)

    modified:   .gitignore
    new file:   mytmp/HelloExpectional.xml

目錄忽略寿桨,它的子目錄和文件呢此衅?

當(dāng)我們忽略一個目錄時,它下面的子目錄和文件也一起被忽略嗎亭螟?

demo-gitignore/mytmp創(chuàng)建一級子目錄son-of-mytmp和二級子目錄grandson-of-mytmp挡鞍,并各自放一個文件,如下結(jié)構(gòu):

?  demo-gitignore git:(master) ? tree mytmp
mytmp
├── Hello.xml
├── HelloExpectional.xml
└── son-of-mytmp
    ├── grandson-of-mytmp
    │   └── grandson.xml
    └── son.xml

2 directories, 4 files

ignore配置:

# project specified gitignore
/mytmp
!/mytmp/HelloExpectional.xml

查看狀態(tài):

?  demo-gitignore git:(master) ? git status -s
 M .gitignore
?? child1/

的的確確 根目錄下的mytmp目錄及其子目錄预烙,都被忽略了墨微。但與此同時奇怪的是!/mytmp/HelloExpectional.xml“例外設(shè)置”并沒有生效?

如果調(diào)整 ignore 設(shè)置:

# project specified gitignore
/mytmp/*
!/mytmp/HelloExpectional.xml

/mytmp調(diào)整為/mytmp/*扁掸,結(jié)果例外生效了翘县。

?  demo-gitignore git:(master) ? git add .
?  demo-gitignore git:(master) ? git status -s
M  .gitignore
A  child1/child2/child3/mytmp/Hello.xml
A  child1/child2/mytmp/Hello.xml
A  child1/mytmp/Hello.xml
A  mytmp/HelloExpectional.xml

總結(jié)備忘

忽略目錄/mytmp/mytmp/*,都會遞歸影響其子目錄和文件的忽略谴分。
只有/mytmp/*忽略锈麸,才能添加形如!/mytmp/HelloExpectional.xml的例外。

glob模式語法

所謂“glob模式”就是我們常見的bash下簡化的正則表達(dá)式牺蹄。就4招:

  • 星號 *忘伞,通配多個字符;
  • 兩個星號**沙兰,表示任意中間層目錄虑省。例如a/**/z 可以匹配目錄a/z, a/b/za/b/c/z等。
  • 問號?僧凰,通配單個字符;
  • 方號[]熟丸,枚舉單個字符训措。例如[abc]表示要么a,要么b,要么c绩鸣,但是ab兩個字符是不能匹配的怀大,只能是1個。
  • 范圍[0-9][a-z] 表示任意一個數(shù)字或字母呀闻。
  • 嘆號!化借,表示“取反”,表示“不忽略”的語義捡多。

使用習(xí)慣

基本概念

  • .gitignore 文件是項(xiàng)目根目錄下的一個隱藏文件蓖康,不是.git子目錄下的。
  • .gitignore 文件對其所在的目錄及其全部子目錄均有效垒手。當(dāng)然用戶級HOME目錄下~/.gitignore文件全局有效蒜焊,項(xiàng)目的ignore繼承覆蓋用戶級的。
  • 配置文件.gitignore本身需要加入版本庫科贬,以便其他組員能共享同一套資源忽略管理規(guī)則泳梆。
?  demo-gitignore git:(master) ? touch .gitignore
?  demo-gitignore git:(master) ? git status -s
?? .gitignore
?  demo-gitignore git:(master) ? git add .gitignore
?  demo-gitignore git:(master) ? git commit .gitignore -m 'create project specified gitignore conf'

共享式 與 獨(dú)享式

ignore 規(guī)則既可以選擇“共享式”讓全組員使用同樣的規(guī)則(文件位置是項(xiàng)目根目錄下的.gitignore文件),好處是大家的配置一樣榜掌,不好是.gitignore內(nèi)容太多优妙,維護(hù)太累。也可以選擇“獨(dú)享式”憎账,只對自己生效套硼,其他組員看不到(因?yàn)槎疾簧蟼鞯桨姹編欤鼠哥!蔼?dú)享式”有兩種形式:

  • 用戶級的 位置在~/.gitignore 用戶HOME目錄下熟菲;
  • 項(xiàng)目級的 位置在.git/info/exclude,它也是一個ignore文件朴恳,語法規(guī)則是一樣的抄罕。注意:盡管.git目錄一定是要上傳到版本庫的(它就是版本庫本身),但是卻留下了exclue是不上傳的于颖。感覺.git的設(shè)計(jì)者很有用心呆贿。

那我們什么時候共享式,什么時候獨(dú)享式呢森渐?個人覺得做入,更多的是團(tuán)隊(duì)的一個約定。我們可以先對需要ignore的東西同衣,做個大致分類:

  • 操作系統(tǒng)層面的 比如Mac OS的 .DS_Store竟块, windows的Thumbs.db
  • IDE層面的 比如Eclipse的.project, .settings/.classpath耐齐。 IDE層面還包括“樸素IDE”浪秘,比如臨時用VIM應(yīng)急修改了個東西蒋情,意外的閃崩生成了一個.swap文件或有些編輯器會生成.bak備份文件。
  • 中間結(jié)果類 比如程序運(yùn)行一下耸携,就打些日志到文件棵癣。再比如嵌入式數(shù)據(jù)庫生成的臨時文件。
  • 語言相關(guān)的 剛說的“中間結(jié)果”日志類的是通用的夺衍,無論哪種語言開發(fā)的程序都會輸出日志狈谊,除此外,還有喝多跟語言編譯相關(guān)的沟沙,比如JAVA的.class字節(jié)碼河劝,比如Web項(xiàng)目構(gòu)建時生成的.war包。

了解這些后尝胆,或許我們可以把前面兩類作為“獨(dú)享式”只作用于自己本地丧裁,比如你用Mac那你配Mac的ignore,用Eclipse配Eclipse的含衔;別人用Window煎娇,他自己配置Windows的。然后把中間結(jié)果和語言相關(guān)的贪染,弄成“共享式”的缓呛,在全組員中共享。

這么多配置需要我們自己寫嗎杭隙? 當(dāng)然不用哟绊,這些問題很多開發(fā)者都是要遇到同樣的問題的,把各種環(huán)境窮舉下痰憎? 事實(shí)上有人給我們做了票髓。

官方ignore模板

官方提供ignore模板 https://github.com/github/gitignore

它的組織形式就是按上文說的“分層組織”。比如:

  • 系統(tǒng)層
  • IDE層
  • 語言層

附錄1:如何刪除已經(jīng)提交铣耘,但不需要提交的資源洽沟?

盡管提倡項(xiàng)目開始的時候,就需要對資源ignore 規(guī)則進(jìn)行設(shè)置蜗细。但是現(xiàn)實(shí)常常沒有那么理想裆操,往往提交后才發(fā)現(xiàn)提交了一些不應(yīng)該提交的東西。怎么刪除它們炉媒?

首先要區(qū)分兩類刪除:

  • 真的不需要的踪区,比如每次編譯產(chǎn)生的 .class,這些文件真的不需要吊骤。

  • 需要缎岗,但不想提交到版本庫的。比如某些臨時的document白粉,你打算提交到wiki密强,而不是版本庫茅郎。

  • 找出“已經(jīng)提交,但不需要提交的”資源

從遠(yuǎn)程拷貝一份或渤。之所以這么做,不用當(dāng)前本地的奕扣,是因?yàn)閕gnore規(guī)則的存在薪鹦,本地一定與遠(yuǎn)程不是完全一致的(從文件系統(tǒng)的角度說的完全一致,不是git diff角度)惯豆。

git clone  http://10.77.144.192:11824/blueocean/passport.git

然后池磁,比如假設(shè)我們之前誤提交了.class文件,那么需要找出:

find . -name "*.class"

發(fā)現(xiàn)./WebRoot/WEB-INF/classes/ 下面居然有楷兽,刪除它們地熄。同時在新拷貝的和本地現(xiàn)有的都刪除。

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末芯杀,一起剝皮案震驚了整個濱河市端考,隨后出現(xiàn)的幾起案子,更是在濱河造成了極大的恐慌揭厚,老刑警劉巖却特,帶你破解...
    沈念sama閱讀 211,265評論 6 490
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件,死亡現(xiàn)場離奇詭異筛圆,居然都是意外死亡裂明,警方通過查閱死者的電腦和手機(jī),發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 90,078評論 2 385
  • 文/潘曉璐 我一進(jìn)店門太援,熙熙樓的掌柜王于貴愁眉苦臉地迎上來闽晦,“玉大人,你說我怎么就攤上這事提岔∠沈龋” “怎么了?”我有些...
    開封第一講書人閱讀 156,852評論 0 347
  • 文/不壞的土叔 我叫張陵唧垦,是天一觀的道長捅儒。 經(jīng)常有香客問我,道長振亮,這世上最難降的妖魔是什么巧还? 我笑而不...
    開封第一講書人閱讀 56,408評論 1 283
  • 正文 為了忘掉前任,我火速辦了婚禮坊秸,結(jié)果婚禮上麸祷,老公的妹妹穿的比我還像新娘。我一直安慰自己褒搔,他們只是感情好阶牍,可當(dāng)我...
    茶點(diǎn)故事閱讀 65,445評論 5 384
  • 文/花漫 我一把揭開白布喷面。 她就那樣靜靜地躺著,像睡著了一般走孽。 火紅的嫁衣襯著肌膚如雪惧辈。 梳的紋絲不亂的頭發(fā)上,一...
    開封第一講書人閱讀 49,772評論 1 290
  • 那天磕瓷,我揣著相機(jī)與錄音盒齿,去河邊找鬼。 笑死困食,一個胖子當(dāng)著我的面吹牛边翁,可吹牛的內(nèi)容都是我干的。 我是一名探鬼主播硕盹,決...
    沈念sama閱讀 38,921評論 3 406
  • 文/蒼蘭香墨 我猛地睜開眼符匾,長吁一口氣:“原來是場噩夢啊……” “哼!你這毒婦竟也來了瘩例?” 一聲冷哼從身側(cè)響起啊胶,我...
    開封第一講書人閱讀 37,688評論 0 266
  • 序言:老撾萬榮一對情侶失蹤,失蹤者是張志新(化名)和其女友劉穎仰剿,沒想到半個月后创淡,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體,經(jīng)...
    沈念sama閱讀 44,130評論 1 303
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡南吮,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 36,467評論 2 325
  • 正文 我和宋清朗相戀三年琳彩,在試婚紗的時候發(fā)現(xiàn)自己被綠了。 大學(xué)時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片部凑。...
    茶點(diǎn)故事閱讀 38,617評論 1 340
  • 序言:一個原本活蹦亂跳的男人離奇死亡露乏,死狀恐怖,靈堂內(nèi)的尸體忽然破棺而出涂邀,到底是詐尸還是另有隱情瘟仿,我是刑警寧澤,帶...
    沈念sama閱讀 34,276評論 4 329
  • 正文 年R本政府宣布比勉,位于F島的核電站劳较,受9級特大地震影響,放射性物質(zhì)發(fā)生泄漏浩聋。R本人自食惡果不足惜观蜗,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 39,882評論 3 312
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望衣洁。 院中可真熱鬧墓捻,春花似錦、人聲如沸坊夫。這莊子的主人今日做“春日...
    開封第一講書人閱讀 30,740評論 0 21
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽。三九已至梧兼,卻和暖如春放吩,著一層夾襖步出監(jiān)牢的瞬間,已是汗流浹背袱院。 一陣腳步聲響...
    開封第一講書人閱讀 31,967評論 1 265
  • 我被黑心中介騙來泰國打工屎慢, 沒想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留,地道東北人忽洛。 一個月前我還...
    沈念sama閱讀 46,315評論 2 360
  • 正文 我出身青樓,卻偏偏與公主長得像环肘,于是被迫代替她去往敵國和親欲虚。 傳聞我的和親對象是個殘疾皇子,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 43,486評論 2 348

推薦閱讀更多精彩內(nèi)容

  • Spring Cloud為開發(fā)人員提供了快速構(gòu)建分布式系統(tǒng)中一些常見模式的工具(例如配置管理悔雹,服務(wù)發(fā)現(xiàn)复哆,斷路器,智...
    卡卡羅2017閱讀 134,629評論 18 139
  • 本文為 Git教程的學(xué)習(xí)筆記腌零,教程源自廖雪峰的博客梯找。這是一個由淺入深,學(xué)完后能立刻上手的Git教程益涧。另锈锤,附上另一本...
    七弦桐語閱讀 6,240評論 5 47
  • 1. 安裝 Github 查看是否安裝git: $ git config --global user.name "...
    Albert_Sun閱讀 13,644評論 9 163
  • November012013-11-01 20:47:02|分類:大學(xué)日記|字號訂閱 今天院里迎新晚會,剛開始...
    獨(dú)行向日葵閱讀 279評論 0 1
  • 不做人闲询, 來到人世干什么久免。 不做自己, 做人又是為什么扭弧。 不投入阎姥, 不能成功。 不遁出鸽捻, 一切沒用呼巴。 不做自己, ...
    再湊熱鬧閱讀 141評論 0 0