關於gitignore的一些筆記_忽略已經提交的文件


因為項目遷移的原因,遭遇了一些ignore的問題,就想趁機會把這個忽略的規則搞清楚,期間搜索到了很多信息,多是讓清楚緩存,即git rm -r --cached .idea,但是沒有詳細的解釋,所以翻到了這一篇文章:https://github.com/wujunchuan/wujunchuan.github.io/issues/18,總結的非常全面,下面是具體內容。


我們在使用git作為版本控制工具的時候,有一些文件是不需要納入版本控制系統中的。例如在編譯過程產生的中間文件等等。正好今天剛好接觸到.gitignore的一些用法。其實.gitignore的語法並不復雜,可以參考

【git】.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.exampledatabase.conf,然后修改database.conf文件。這樣既滿足了項目的模板配置文件能夠下發到每個參與開發的人,又不會跟蹤每個人編寫的配置文件。

另外一種辦法為何不好

剛才提到了,可以通過git update-index --assume-unchanged讓git忽略我本地需要排除的文件,提交到遠程分支后,這樣git就不會把這些修改提交到版本庫了。 為啥要單獨拿出來談論,因為這種做法並不友好,並且有副作用。

  • 所有成員都必須對目標文件執行git update-index --assume-unchanged <PATH>
  • 如果有人改變了目標文件后忘記執行上一個步驟直接push,那么后面拉取的最新代碼的成員都需要重新執行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

如果項目有需求,希望 忽略本地文件的修改,但是文件保存在遠端倉庫的話。 最佳實現是對充當模板的文件在文件名下加以區分。



注意!

本站转载的文章为个人学习借鉴使用,本站对版权不负任何法律责任。如果侵犯了您的隐私权益,请联系我们删除。



 
粤ICP备14056181号  © 2014-2021 ITdaan.com