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 bit to tell Git when you change the working tree file. This is bit file. project on a filesystem that has very slow lstat(2) system call (e.g. cifs).
This option can be also used as a coarse file-level mechanism to ignore uncommitted changes in tracked files (akin to filesgitignore does for untracked .) .
tl;dr: 正確的做法應該是:
git rm --cached logs/xx.log
,然后更新.gitignore
忽略掉目标文件,最后git commit -m "We really don't want Git to track this anymore!"
具體的原因如下:
被採納的答案雖然能達到(暫時的)目的,但並非最正確的做法,這樣做是誤解了
git update-index
的含義,而且這樣做帶來的最直接(不良)後果是這樣的:所有的團隊成員都必須對目標檔案執行:
git update-index --assume-unchanged <PATH>
。這是因為即使你讓 Git 假裝看不見目標文件的改變,但文件本身還是在 Git 的歷史記錄裡的,所以團隊的每個人在 fetch 的時候都會拉到目標文件的變更。 (但實際上目標檔案是根本不想被 Git 記錄的,而不是假裝看不見它發生了改變)一旦有人改變目標檔案之後沒有
git update-index --assume-unchanged <PATH>
就直接 push 了,那麼接下來所有拉取了最新程式碼的成員必須重新執行 update-index,否則 Git 又會開始記錄目標檔案的變更。這點其實很常見的,比如說某成員換了機器或硬碟,重新clone 了一份程式碼庫,由於目標檔還在Git 的歷史記錄裡,所以他/她很可能會忘記update- index。為什麼會這樣?答案就在 Git 的 man pages 裡:
首先,git update-index 的定義是:
這句話隱含的意思是:update-index 針對的是 Git 資料庫裡被記錄的文件,而不是那些需要忽略的文件。
接著看關於 --assume-unchanged 的幾句相關的描述:
大致意思是:
我們知道 Git 不只是用來做程式碼版本管理的,許多其他領域的專案也會使用 Git。比如說我公司曾經一個客戶的專案涉及到精密零件圖紙文件的版本管理,他們也用 Git。有一個使用場景是對一些體積龐大的檔案進行修改,但是每一次儲存 Git 都要計算檔案的變化並更新工作區,這在硬碟慢的時候延遲卡頓非常明顯。
git update-index --assume-unchanged
的真正用法是這樣的:git update-index --assume-unchanged
,這樣 Git 暫時不會理睬你對文件做的修改;git update-index --no-assume-unchanged
,於是 Git 只需要做一次更新,這是完全可以接受的了;另外,根據文件的進一步描述:
.gitignore
.gitignore 裡的規則卻沒有效果? 這是因為我們誤解了
.gitignore文件的用途,該文件只能作用於Untracked Files,也就是那些從來沒有被Git 記錄過的文件(自添加以後,從未add 及commit 過的文件)。 之所以你的規則不生效,是因為那些
對它們完全無效。這也正是開頭那段簡短答案所做的事:.log
檔案曾經被 Git 記錄過,因此.log
文件曾经被 Git 记录过,因此.gitignore
最後有一點要注意的,
+忽略+提交。已經維護起來的文件,即使加上了gitignore,也無濟於事。
用下面這個指令:
git update-index --assume-unchanged logs/*.log
這樣每次提交就不會出現logs下面的文件了
自己來一段詳細的答案
.gitignore只能忽略那些原來沒有被track的文件,如果某些文件已經被納入了版本管理中,則修改.gitignore是無效的。
正確的做法是在每個clone下來的倉庫中手動設定不要檢查特定檔案的變更情況。
另外 git 還提供了另一種 exclude 的方式來做同樣的事情,不同的是 .gitignore 這個檔案本身會提交到版本庫中去。用來保存的是公共的需要排除的文件。而 .git/info/exclude 這裡設定的則是你自己本地需要排除的檔案。 他不會影響到其他人。也不會提交到版本庫中去。
.gitignore 還有個有意思的小功能, 一個空的 .gitignore 檔案 可以當作是一個 placeholder 。當你需要為專案建立一個空的 log 目錄時, 這就變的很有用。 你可以建立一個 log 目錄 在裡面放置一個空的 .gitignore 檔案。這樣當你 clone 這個 repo 的時候 git 會自動的創建好一個空的 log 目錄了。
把log檔刪了,加ingore, 再commit
我發現最高票(n͛i͛g͛h͛t͛i͛r͛e͛)的答案壓根沒有理解題主的問題
反而是@FatGhosta的答案才是正確的
如果按照n͛i͛g͛h͛t͛i͛r͛e͛的方法進行操作只是達到
“將不需要記錄的文件從git中刪除的同時在本地保留該文件並在以後的提交中忽略”
而不是達到
“提交時已忽略在gitgit中存在的文件」
其實場景應該是這樣的有一個配置文件比如是數據庫的鏈接信息
每個人的鏈接信息肯定不是一樣的但是又要提供一個標準的模板用來告知如何填寫鏈接信息
那麼就存在git上需要記錄一個標準配置文件然後每個人根據自己的具體情況配置一份鏈接信息自用但是不會將該配置文件提交到庫裡的情況
因此FatGhosta的答案才是該題目下正確的回答