git忽略已經(jīng)被提交的文件

https://segmentfault.com/q/1010000000430426

tl;dr: 正確的做法應(yīng)該是:git rm --cached logs/xx.log,然后更新 .gitignore 忽略掉目標(biāo)文件,最后 git commit -m "We really don't want Git to track this anymore!"

具體的原因如下:

被采納的答案雖然能達(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畅涂。
為什么會這樣港华?答案就在 Git 的 man pages 里:

首先,git update-index 的定義是:

Register file contents in the working tree to the index(把工作區(qū)下的文件內(nèi)容注冊到索引區(qū))
這句話暗含的意思是:update-index 針對的是 Git 數(shù)據(jù)庫里被記錄的文件毅戈,而不是那些需要忽略的文件苹丸。

接著看關(guān)于 --assume-unchanged 的幾句相關(guān)的描述:

When the "assume unchanged" bit is on, Git stops checking the working tree files for possible modifications, so you need to manually unset the bit to tell Git when you change the working tree file. This is sometimes helpful when working with a big project on a filesystem that has very slow lstat(2) system call (e.g. cifs).
大致意思是:

應(yīng)用了該標(biāo)識之后,Git 停止查看工作區(qū)文件可能發(fā)生的改變苇经,所以你必須 手動 重置該標(biāo)識以便 Git 知道你想要恢復(fù)對文件改變的追蹤。當(dāng)你工作在一個大型項(xiàng)目中宦言,這在文件系統(tǒng)的 lstat 系統(tǒng)調(diào)用非常遲鈍的時候會很有用扇单。
我們知道 Git 不僅僅是用來做代碼版本管理的,很多其他領(lǐng)域的項(xiàng)目也會使用 Git奠旺。比如說我公司曾經(jīng)一個客戶的項(xiàng)目涉及到精密零件圖紙文檔的版本管理蜘澜,他們也用 Git。有一種使用場景是對一些體積龐大的文件進(jìn)行修改响疚,但是每一次保存 Git 都要計算文件的變化并更新工作區(qū)鄙信,這在硬盤慢的時候延遲卡頓非常明顯。

git update-index --assume-unchanged 的真正用法是這樣的:

你正在修改一個巨大的文件忿晕,你先對其 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)(針對未追蹤的文件)选浑。
隨之而來的問題是:為什么我增加了 .gitignore 里的規(guī)則卻沒有效果?

這是因?yàn)槲覀冋`解了 .gitignore 文件的用途玄叠,該文件只能作用于 Untracked Files鲜侥,也就是那些從來沒有被 Git 記錄過的文件(自添加以后,從未 add 及 commit 過的文件)诸典。

之所以你的規(guī)則不生效描函,是因?yàn)槟切?.log 文件曾經(jīng)被 Git 記錄過,因此 .gitignore 對它們完全無效狐粱。這也正是開頭那段簡短答案所做的事情:

從 Git 的數(shù)據(jù)庫中刪除對于該文件的追蹤舀寓;
把對應(yīng)的規(guī)則寫入 .gitignore,讓忽略真正生效肌蜻;
提交+推送互墓。
只有這樣做,所有的團(tuán)隊(duì)成員才會保持一致而不會有后遺癥蒋搜,也只有這樣做篡撵,其他的團(tuán)隊(duì)成員根本不需要做額外的工作來維持對一個文件的改變忽略。

最后有一點(diǎn)需要注意的豆挽,git rm --cached 刪除的是追蹤狀態(tài)育谬,而不是物理文件;如果你真的是徹底不想要了帮哈,你也可以直接 rm+忽略+提交膛檀。

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末,一起剝皮案震驚了整個濱河市娘侍,隨后出現(xiàn)的幾起案子咖刃,更是在濱河造成了極大的恐慌,老刑警劉巖憾筏,帶你破解...
    沈念sama閱讀 216,470評論 6 501
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件嚎杨,死亡現(xiàn)場離奇詭異,居然都是意外死亡氧腰,警方通過查閱死者的電腦和手機(jī)枫浙,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 92,393評論 3 392
  • 文/潘曉璐 我一進(jìn)店門刨肃,熙熙樓的掌柜王于貴愁眉苦臉地迎上來,“玉大人自脯,你說我怎么就攤上這事之景。” “怎么了膏潮?”我有些...
    開封第一講書人閱讀 162,577評論 0 353
  • 文/不壞的土叔 我叫張陵锻狗,是天一觀的道長。 經(jīng)常有香客問我焕参,道長轻纪,這世上最難降的妖魔是什么? 我笑而不...
    開封第一講書人閱讀 58,176評論 1 292
  • 正文 為了忘掉前任叠纷,我火速辦了婚禮刻帚,結(jié)果婚禮上,老公的妹妹穿的比我還像新娘涩嚣。我一直安慰自己崇众,他們只是感情好,可當(dāng)我...
    茶點(diǎn)故事閱讀 67,189評論 6 388
  • 文/花漫 我一把揭開白布航厚。 她就那樣靜靜地躺著顷歌,像睡著了一般。 火紅的嫁衣襯著肌膚如雪幔睬。 梳的紋絲不亂的頭發(fā)上眯漩,一...
    開封第一講書人閱讀 51,155評論 1 299
  • 那天,我揣著相機(jī)與錄音麻顶,去河邊找鬼赦抖。 笑死,一個胖子當(dāng)著我的面吹牛辅肾,可吹牛的內(nèi)容都是我干的队萤。 我是一名探鬼主播,決...
    沈念sama閱讀 40,041評論 3 418
  • 文/蒼蘭香墨 我猛地睜開眼宛瞄,長吁一口氣:“原來是場噩夢啊……” “哼浮禾!你這毒婦竟也來了?” 一聲冷哼從身側(cè)響起份汗,我...
    開封第一講書人閱讀 38,903評論 0 274
  • 序言:老撾萬榮一對情侶失蹤,失蹤者是張志新(化名)和其女友劉穎蝴簇,沒想到半個月后杯活,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體,經(jīng)...
    沈念sama閱讀 45,319評論 1 310
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡熬词,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 37,539評論 2 332
  • 正文 我和宋清朗相戀三年旁钧,在試婚紗的時候發(fā)現(xiàn)自己被綠了吸重。 大學(xué)時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片。...
    茶點(diǎn)故事閱讀 39,703評論 1 348
  • 序言:一個原本活蹦亂跳的男人離奇死亡歪今,死狀恐怖嚎幸,靈堂內(nèi)的尸體忽然破棺而出,到底是詐尸還是另有隱情寄猩,我是刑警寧澤嫉晶,帶...
    沈念sama閱讀 35,417評論 5 343
  • 正文 年R本政府宣布,位于F島的核電站田篇,受9級特大地震影響替废,放射性物質(zhì)發(fā)生泄漏。R本人自食惡果不足惜泊柬,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 41,013評論 3 325
  • 文/蒙蒙 一椎镣、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧兽赁,春花似錦状答、人聲如沸。這莊子的主人今日做“春日...
    開封第一講書人閱讀 31,664評論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽。三九已至蒲跨,卻和暖如春译断,著一層夾襖步出監(jiān)牢的瞬間,已是汗流浹背或悲。 一陣腳步聲響...
    開封第一講書人閱讀 32,818評論 1 269
  • 我被黑心中介騙來泰國打工孙咪, 沒想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留,地道東北人巡语。 一個月前我還...
    沈念sama閱讀 47,711評論 2 368
  • 正文 我出身青樓翎蹈,卻偏偏與公主長得像,于是被迫代替她去往敵國和親男公。 傳聞我的和親對象是個殘疾皇子荤堪,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 44,601評論 2 353

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