git如何忽略已經提交的文件 (.gitignore文件無效)
一. 問題
在初始化git
倉庫的時候沒有創建.gitignore
文件來過濾不必要提交的文件, 後來卻發現某些文件不需要提交, 但是這些文件已經被提交了, 這時候創建.gitignore
文件忽略這些文件時, 發現ignore
的規則對那些已經被track的文件無效.
其實.gitignore
文件只會忽略那些沒有被跟蹤的文件, 也就是說ignore
規則只對那些在規則建立之後被新創建的新文件生效. 因此推薦: 初始化git項目時就創建.gitignore
文件.
那麼如何使.gitignore
文件的規則對於那些已經被track
的文件生效呢 ?
二. 解決方法
網上有人說使用git update-index --assume-unchanged /path/to/file
這個命令來將已經track
的文件標記一下, 使其不出現在更新列表中(git status
不會列出標記過的文件), 其實這是治標不治本的做法.。
這樣做, 只在你的項目中生效. 如果是一個團隊, 其他開發人員也需要這麼做. 而且這個命令只對文件有效. 如果有很多需要忽略的文件呢?? 用正則表達式!是的, 這樣git update-index --assume-unchanged /path/to/*
. 可是這樣只對某個目錄下的所有文件有效, 如果要迭代某個目錄下的所有文件和子目錄下的所有文件呢? 這個我暫時還不知道怎麼弄, 知道的朋友可以告訴我 (♥◠‿◠)ノ。
總之, 用這個命令來解決問題非常麻煩 !! 你可以參考一下關於此命令的相關討論 ==> 點這裏
這個討論裏面也給出了真正的解決方法, 那就是:
-
刪除
track
的文件 (已經commit
的文件)git rm
要忽略的文件git commit -a -m "刪除不需要的文件"
-
在
.gitignore
文件中添加忽略規則- 在
.gitignore
文件中添加ignore條目, 如: some/path/some-file.ext - 提交
.gitignore
文件:git commit -a -m "添加ignore規則"
- 在
-
推送到遠程倉庫是
ignore
規則對於其他開發者也能生效:git push [remote]
注意: 上述步驟針對已經commit
過的文件 (當然如果是commit
過的文件且又有改動也是同樣生效)
這樣其他開發人員同步之後, 新的ignore
規則就會對以前track
過的文件生效了 (因爲以前track的文件已經被untrack且被刪除了, 如果還有這樣的文件, 那肯定是新生成的! )
如果文件比較少可以直接, git rm
掉那些不必要的文件. 有時會跟蹤一些IDE的生成文件, 如Android Studio的.idea
目錄 或 構建輸出文件 如 build
目錄下的文件。
對於build目錄中的文件都是不需要跟蹤的, 重新構建之後此目錄就會更新, git status
後發現此目錄下的文件在更新列表中, 那麼你可以使用git rm -r --cached命令
(刪除工作空間中有改動的那些文件, 用git status
可以看到cached
的列表) 結合正則表達式來快速刪除目錄中的文件和子目錄中的文件。
因此對於已經track
且有改動的文件添加ignore
規則, 如下:
git rm -r --cached 要忽略的文件
(如: git rm -r --cahced build/*, 如修改列表中的內容全部是不需要的, 那麼你可以使用最最簡單的命令搞定git rm -r --cached .)git add .
git commit -m " commet for commit ....."
git push
push之後其他開發人員pull之後, ignore規則就對其生效了.
注意: 上述步驟只針對已經commit
過且有改動的文件 (因爲rm
的是cached
列表中的文件, cached
列表即修改列表)
三. 總結
最好創建git
倉庫的同時創建.gitignore
文件, 並且把忽略規則寫好(儘量考慮到所有應該略的文件, 這樣就可以避免出現上面的文件啦)