Skip to main content

Git skip-worktree 忽略已追蹤的檔案修改

·107 words·1 min
Tech Git
Author
Ian Chiu

前言
#

在開發過程中,有時候我們需要保留某些檔案的本地設定變更,但又不希望這些變更被提交到遠端 (´・_・`)

例如:

  • 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 導致不能正常運作