徹底解決惱人的.idea/workspace.xml

回想我剛開始使用PhpStorm與git時,只要稍微在PhpStorm做些操作,PhpStorm就會去更新它自己的.idea/workspace.xml,而造成整個project在沒有commit狀態,但無論我怎麼寫.gitignore,git還是會去追蹤.idea/workspace.xml,怎樣也移除不掉。本文整理出3個方法解決此問題。

Version


PhpStorm 10.0.1
git 2.6.0
SourceTree 2.0.5.2

初學者使用PhpStorm與Git


回想我之前使用PhpStorm與git的流程是 :

從此之後,惱人的`.idea/workspace.xml就不時出現,讓我的專案常常在沒有commit狀態,就算我在.gitignore加上了.idea/workspace.xml還是沒用,一度以為是git或SourceTree的bug。

為什麼Git會一直追蹤?


一旦PhpStorm開啟過專案後,就會建立.idea目錄,目錄下的檔案都是PhpStorm自己所用的檔案,包括最常更新的workspace.xml,之後在使用git時,又使用了git add .,所以連.idea目錄下所有檔案都進了Git repository。

只要檔案進了git repository之後,.gitignore就擋不住了,無論你在.gitignore怎麼加.idea/workspace.xml也沒用。

方法1 : 修改.gitignore


使用Composer建立Laravel專案

(略)

修改.gitignore

.gitignore
1
2
3
4
5
6
/vendor
/node_modules
Homestead.yaml
Homestead.json
.env
.idea

一開始就將.idea目錄加進.gitignore,確保將來git add .時,.idea目錄下所有檔案都不會進Git。1 1若你有使用一個專案使用一個Homestead,建議一開始也在.gitignore加上.vagrant,如此連Homestead所建立的暫存檔也不會進入Git repository。

建立Git Repository

1
oomusou@mac:~/MyProject$ git init
oomusou@mac:~/MyProject$ git add .
oomusou@mac:~/MyProject$ git commit -m "Initial commit."

使用PhpStorm開啟專案

此時PhpStorm還是如往常會建立.idea目錄。

因為事先寫在.gitignore加了.idea,所以.idea目錄不會進入Git repository。

以後Git再也不會track .idea/workspace.xml

方法2 : 修改.gitignore_global


將home directory下的.gitignore_global,修改成如下 :

~/.gitignore_global
1
2
3
*~
.DS_Store
.idea

由於每個目錄下的.gitignore都會繼承.gitignore_global的設定,因此將來再也不用修改Laravel專案目錄下的.gitignore

方法3 : 將.idea從Repository移除


剛剛的方法只適用於新專案,若.idea目錄已經在Git repository者,就不能用以上方法。
如下圖,一開始就誤入歧途,將.idea目錄送進Git repository了。

接下來介紹2種方法,分別使用Git指令與使用SourceTree。

使用Git指令

刪除.idea目錄

1
oomusou@mac:~/MyProject$ git rm --cached -r .idea

rm --cached : 表示從此以後Git repository不需要track這個檔案或目錄,也就是這個檔案會從tracked變成untracked狀態,而這個檔案或目錄在index也會被刪除,不過並不會刪除實體檔案或目錄。
-r: recursive,表示目錄下的檔案也一併刪除。

SourceTree上方馬上顯示在index裡,.idea目錄下的檔案被刪除。下方則顯示.idea目錄下的檔案變成untracked,並且成為Uncommitted changes狀態。

修改.gitignore

.gitignore
1
2
3
4
5
6
/vendor
/node_modules
Homestead.yaml
Homestead.json
.env
.idea

因為現在.idea目錄下的檔案都是untracked,所以.gitignore有效。
趕快修改.gitignore,將.idea加進去。

重新Commit

1
oomusou@mac:~/MyProject$ git add .
oomusou@mac:~/MyProject$ git commit -m "remove .idea"

剛修改的.gitignore已經加入,且.idea目錄下的檔案已經從Git repository移除,以後workspace.xml再也不會煩你了。

使用SourceTree

Stop Tracking

選擇要移除的.idea目錄諸檔,Actions -> Stop Tracking
其實這就相當於git rm --cached -r .idea

SourceTree上方馬上顯示在index裡,.idea目錄下的檔案被刪除。下方則顯示.idea目錄下的檔案變成untracked,並且成為Uncommitted changes狀態。

修改.gitignore

Unstaged files後方的...,選擇Ignore file

Ignore everything beneath .idea

我們發現SourceTree幫我們在.gitignore加上了.idea。這相當於在.gitignore中加入.idea

重新Commit

.gitignore加進Staged files。這相當於git add .

按下右上角Commit,寫下註解,按右下角Commit正式commit。這相當於git commit -m "remove .idea"

最後如同自己下git指令一樣,剛修改的.gitignore已經加入,且.idea目錄下的檔案已經從git repository移除,以後workspace.xml再也不會煩你了。

Conclusion


  • 一個看似很基本的問題,卻要大費周章才能用Git解決。
  • 修改.gitignore_global的方式,可以一勞永逸解決掉.idea/workspace.xml的問題。
  • 其實現在學Git,不用再很執著一定要用Git指令,應該Git指令 + SourceTree,指令只是幫助理解,但實務上還是要用SourceTree才有效率。