前言 #
在開發過程中,有時候我們需要保留某些檔案的本地設定變更,但又不希望這些變更被提交到遠端 (´・_・`)
例如:
package.json
:本地端測試用的套件版本tsconfig.json
:不同開發者的編譯設定.env
:個人環境變數(雖然通常不會被版本控制,但有時可能已經被誤加)
這時候,光靠 .gitignore
是沒用的,因為 .gitignore
只會忽略未被追蹤的檔案,對已經被版本控制的檔案無效。
因此,我們要使用到 Git 提供了 skip-worktree
功能,讓我們可以在本地端「忽略已追蹤檔案的變更」。
忽略已追蹤檔案的修改 #
假設你要在本地忽略 package.json
的變更,可以使用:
git update-index --skip-worktree package.json
這個指令會告訴 Git:
「我不想讓這些檔案的本地修改出現在 git status 中,也不想讓它們影響提交。」
但是我又想提交修改了 (๑•́ ₃ •̀๑)
#
有時候我們的忽略只是為了本地端開發方便。
方便完了,還是需要提交這些檔案的變更,例如更新套件版本或編譯設定。
這時候,我們要這樣操作:
# 取消忽略
git update-index --no-skip-worktree package.json
# 正常提交
git add package.json
git commit -m "update package.json"
# 再次忽略
git update-index --skip-worktree package.json
這樣就能在需要的時候提交,提交後再恢復忽略狀態。
我要怎麼知道我忽略了哪些檔案 (◔౪◔)
#
如果想知道目前有哪些檔案被 skip-worktree 設定忽略掉了,可以使用:
git ls-files -v | grep ^S
# output
S package.json
S tsconfig.json
# 開頭的 S 代表該檔案已被設定為 skip-worktree
額外發現 #
自己用了一下之後突然發現,用 git skip-worktree package.json 檔會讓 lint-staged 不能使用 。・゚・(つд`゚)・゚・
因為 linted-staged 就是在抓 git status 去判斷的,我們忽略掉 package.json 後,他就會抓不到 configuration 導致不能正常運作