因為項目遷移的原因,遭遇了一些ignore的問題,就想趁機會把這個忽略的規則搞清楚,期間搜索到了很多信息,多是讓清楚緩存,即git rm -r --cached .idea,但是沒有詳細的解釋,所以翻到了這一篇文章:https://github.com/wujunchuan/wujunchuan.github.io/issues/18,總結的非常全面,下面是具體內容。
我們在使用git作為版本控制工具的時候,有一些文件是不需要納入版本控制系統中的。例如在編譯過程產生的中間文件等等。正好今天剛好接觸到.gitignore
的一些用法。其實.gitignore
的語法並不復雜,可以參考
或者在命令行中輸入man gitignore
可以查看具體用法
每個項目都有不同的需求,我們不可能一一列舉,這樣太麻煩了。好在GitHub官方有發起一個庫,這里收藏了許多常見的項目所一般需要忽略的文件。我們可以在這個文件的基礎上稍加修改,以滿足我們的需要。
a collection of useful .gitignore templates
要養成一開始就設置好.gitignore
的好習慣,以免將來誤提交了這類無用的文件
為了避免麻煩,最好是一開始就設定好.gitignore
文件,避免誤提交了這些無用的文件。但是並不是所有情況都能在最開始就考慮周全的。因為.gitignore
只能忽略掉那些原來沒有被track的文件,如果有一些文件已經被納入版本控制管理當中,那么直接修改.gitignore
是無效的
忽略已經提交的文件場景分為很多種
例如說,有些文件已經被提交,但是后期做項目的過程中,我們想要忽略這些文件的跟蹤。這些文件在本地磁盤中還想保留着
此時我們可以這樣做:
git rm --cache somefiles
刪除本地緩存更新
gitignore
文件,忽略目標文件(somefiles
)最后
git commit -m 'We don't need that somefiles
注意,這種方法下somefiles只會在提交者的磁盤中保留,如果其他開發者拉取你的commit后,他們磁盤內的這些文件也會消失
又比如說,有些文件已經被提交,但是后期做項目的過程中,我們發現我們並不需要跟蹤這些文件。這些文件的存在只會讓沖突更加頻繁。我們想要讓這些文件徹底的移除出版本控制系統
此時我們可以這樣做:
git rm somefiles
從本地移除這個文件,並且刪除本地緩存更新
gitignore
文件,忽略目標文件(somefiles
)最后
git commit -m 'We don't need that somefiles
但是我們有時候需要有一個配置文件,例如數據庫的連接信息,每個開發者的連接信息都是不一樣的。但是又要提供一個標准的模板來告知如何填寫連接信息,那么就需要在倉庫中記錄一個標准配置文件,然后每個人根據自己的具體情況配置一份連接信息自用,但是不會將這個配置文件提交到倉庫里。
能不能先將其納入版本控制,然后再編寫
.gitignore
來忽略這個文件?這樣一來別的開發者也有這個文件了。答案是:不能,剛才我們說了,已經提交的文件不能直接通過
.gitignore
來忽略這個文件。一旦修改了這個配置文件,git仍然會檢測到的。當然有一個做法是通過git update-index --assume-unchanged
。這個待會討論。
對於這個需求,一些知名的開源項目是這樣處理的,可以將其當做一個最佳實踐
對於充當模板的文件,在文件名加以區分
例如實際配置文件叫
database.conf
,在寫好模板后更名為database.conf.example
。git將database.conf.example
納入管理,但是忽略database.conf
。在項目中約定,每個人clone下項目之后,復制database.conf.example
為database.conf
,然后修改database.conf
文件。這樣既滿足了項目的模板配置文件能夠下發到每個參與開發的人,又不會跟蹤每個人編寫的配置文件。
剛才提到了,可以通過git update-index --assume-unchanged
讓git忽略我本地需要排除的文件,提交到遠程分支后,這樣git就不會把這些修改提交到版本庫了。 為啥要單獨拿出來談論,因為這種做法並不友好,並且有副作用。
git update-index --assume-unchanged <PATH>
git update-index --assume-unchanged <PATH>
,否者這個文件又開始被追蹤了。 git update-index --assume-unchanged
的真正用法應該是這樣的:
當你修改一個巨大的文件的時候,每次保存一次Git都要計算文件的變化並且更新工作區,當磁盤速度慢的時候延遲卡頓非常大,這個時候就可以先對文件進行git update-index --assume-unchanged
操作,這樣Git就暫時不會計算你對文件所做的修改。當你的工作已經完成可以進行提交的時候,重置標識為git update-index --no-assume-unchanged
,此時Git只需要進行一次的更新。相較於每次保存都計算一次更新而言,這顯然是可以接受的。
經常有人會問 為什么我增加了.gitignore里的規則卻沒有效果 ,那是因為.gitignore
文件只能作用於未跟蹤的文件( Untracked Files ),也就是從來沒有被Git記錄過的文件。所以要先從Git索引中刪除對改文件的追蹤,才能使.gitignore
文件生效。而刪除文件的追蹤是git rm
,這種做法會將本地的物理文件一並刪除。如果想要刪除追蹤狀態而非物理文件,可以使用git rm --cached
如果項目有需求,希望 忽略本地文件的修改,但是文件保存在遠端倉庫的話。 最佳實現是對充當模板的文件在文件名下加以區分。
本站转载的文章为个人学习借鉴使用,本站对版权不负任何法律责任。如果侵犯了您的隐私权益,请联系我们删除。