1.問題背景
項目有一些開發時用的配置文件,需要用到所以不能刪,但是卻不想提交改動。
理所當然地想到將它加入 .gitignore
規則中,但是我的改動還是被 git
被捕捉到了,為啥呢?
gitignore - Specifies intentionally untracked files to ignore
官方文檔給出了標准答案,原來 .gitignore
只對未跟蹤的文件起作用!
已跟蹤的文件是指那些被納入了版本控制的文件,在上一次提交中有它們的記錄。那么未跟蹤文件就是指那些從沒提交過的文件。
因為我之前已經使用提交過了,所以.gitignore
也救不了我 。
那我現在已經覆水難收的情況下,想要忽略 index.scss 該怎么做?
2.解決方案
我與 git 的對話
【我】:我的目的是在倉庫里面保留 index.scss,但是要所有人忽略它的改動。你能做到嗎?
【git】:我做不到,我是個版本控制的倉庫,我要為所有文件的版本負責,而不是你存儲文件的中轉站!但是你可以這樣:
- 別讓我管理你的 index.scss,踢出我的版本控制,存在自個兒的電腦里。
- 暫時只忽略你的文件改動,別人已加到版本庫的文件改動,你可管不着。
讓我們來看看根據 git 提供的思路,如何實踐。
(1)取消跟蹤,刪除遠程文件(推薦)
你要做的
- 先將 src/index.scss 加入
.gitignore
文件。 - 再執行以下命令:
git rm -r --cached .
git add .
git commit -m "update gitignore"
在你的電腦進行以上操作后,index.scss 正式脫離了版本管理的管制。git rm --cached
會保留你本機的文件,但是會從版本庫里面刪除。
其他電腦要做的
git pull
- 將 index.scss 加回來
因為其他主機(您同事的電腦等等)在 git pull
你以上的改動時,index.scss 會被刪除,所以 index.scss 需要加回來。
可以手動加回來,也可以使用構建工具初始化自動生成 index.scss 文件。
(2)暫時忽略已跟蹤文件的變更,不刪除遠程文件(不推薦)
你要做的
git update-index --assume-unchanged src/index.scss
其他電腦要做的
git update-index --assume-unchanged src/index.scss
git update-index
為一個單獨文件創建暫存區,--assume-unchanged
通知 git 不要再監控這個文件的改動了。
合起來的意思是:我單獨把你拎出來,暫時先跟蹤你。因為命令只對當前工作區生效,同理其他主機也要進行同樣的操作。
為什么推薦方案(1)不推薦方案(2)?
方案(2)非常純粹,一招鮮吃遍天。
但是它容易出錯,如果某個同事忘記執行這條指令,將 index.scss 提交到了版本庫, 那么其他人都需要一起——重新執行命令,再次讓版本庫忽略 index.scss。
過來人告訴你,這方法真的不好維護。
使用方案(1),因為文件已經刪了,且已經將其加入到了 .gitignore
,后續的提交都不會跟蹤這份新的 index.scss 文件。同事忘不忘記操作也只是影響他自己,而且只需一次操作,無后顧之憂。
資料
來源:https://zhuanlan.zhihu.com/p/270144760