如何讓Git不要管理.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
1 | /vendor |
一開始就將.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
,修改成如下 :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
1 | /vendor |
因為現在.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才有效率。