隨之而來的問題是:為什么我增加了 .gitignore 里的規(guī)則卻沒有效果?
這是因?yàn)槲覀冋`解了 .gitignore 文件的用途吆玖,該文件只能作用于 Untracked Files,也就是那些從來沒有被 Git 記錄過的文件(自添加以后马篮,從未 add 及 commit 過的文件)沾乘。
1. git rm --cached logs/xx.log // if file is traced
2. 然后更新 .gitignore 忽略掉目標(biāo)文件,
3. 最后 git commit -m "We really don't want Git to track this anymore!"
之所以你的規(guī)則不生效积蔚,是因?yàn)槟切?.log 文件曾經(jīng)被 Git 記錄過意鲸,因此 .gitignore 對它們完全無效。這也正是開頭那段簡短答案所做的事情:
1. 從 Git 的數(shù)據(jù)庫中刪除對于該文件的追蹤尽爆;
2. 把對應(yīng)的規(guī)則寫入 .gitignore怎顾,讓忽略真正生效;
3. 提交+推送漱贱。
最后有一點(diǎn)需要注意的槐雾,git rm --cached
刪除的是追蹤狀態(tài),而不是物理文件幅狮;如果你真的是徹底不想要了募强,你也可以直接rm+忽略+提交
。
About Another Command
git update-index --assume-unchanged logs/*.log
的真正用法是這樣的:
你正在修改一個巨大的文件崇摄,你先對其 git update-index --assume-unchanged
擎值,這樣 Git 暫時不會理睬你對文件做的修改;
當(dāng)你的工作告一段落決定可以提交的時候逐抑,重置改標(biāo)識:git update-index --no-assume-unchanged
鸠儿,于是 Git 只需要做一次更新,這是完全可以接受的了厕氨;
提交+推送
进每。
另外,根據(jù)文檔的進(jìn)一步描述:
This option can be also used as a coarse file-level mechanism to ignore uncommitted changes in tracked files (akin to what .gitignore does for untracked files).
這段描述告訴我們兩個事實(shí):
雖然可以用其來達(dá)成樓主想要的結(jié)果命斧,但這是不講究的做法(coarse)田晚;
同樣的事情更應(yīng)該用 .gitignore 文件來實(shí)現(xiàn)(針對未追蹤的文件)。
git update-index --assume-unchanged logs/*.log
雖然能達(dá)到(暫時的)目的国葬,但并非最正確的做法贤徒,這樣做是誤解了 git update-index 的含義,而且這樣做帶來的最直接(不良)后果是這樣的:
所有的團(tuán)隊(duì)成員都必須對目標(biāo)文件執(zhí)行:
git update-index --assume-unchanged <PATH>汇四。
這是因?yàn)榧词鼓阕?Git 假裝看不見目標(biāo)文件的改變泞莉,
但文件本身還是在 Git 的歷史記錄里的,
所以團(tuán)隊(duì)的每個人在 fetch 的時候都會拉到目標(biāo)文件的變更船殉。
(但實(shí)際上目標(biāo)文件是根本不想被 Git 記錄的鲫趁,
而不是假裝看不見它發(fā)生了改變)
一旦有人改變目標(biāo)文件之后沒有
git update-index --assume-unchanged <PATH> 就直接 push 了,
那么接下來所有拉取了最新代碼的成員必須重新執(zhí)行 update-index利虫,
否則 Git 又會開始記錄目標(biāo)文件的變化挨厚。
這一點(diǎn)實(shí)際上很常見的,比如說某成員換了機(jī)器或者硬盤糠惫,重新 clone 了一份代碼庫疫剃,
由于目標(biāo)文件還在 Git 的歷史記錄里,
所以他/她很可能會忘記 update-index硼讽。