git如何忽略已經commit的文件

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/*. 可是這樣只對某個目錄下的所有文件有效, 如果要迭代某個目錄下的所有文件和子目錄下的所有文件呢? 這個我暫時還不知道怎麼弄, 知道的朋友可以告訴我 (♥◠‿◠)ノ

總之, 用這個命令來解決問題非常麻煩 !! 你可以參考一下關於此命令的相關討論 ==> 點這裏

這個討論裏面也給出了真正的解決方法, 那就是:

  1. 刪除track的文件 (已經commit的文件)

    • git rm 要忽略的文件
    • git commit -a -m "刪除不需要的文件"
  2. .gitignore文件中添加忽略規則

    • .gitignore文件中添加ignore條目, 如: some/path/some-file.ext
    • 提交.gitignore文件:git commit -a -m "添加ignore規則"
  3. 推送到遠程倉庫是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文件, 並且把忽略規則寫好(儘量考慮到所有應該略的文件, 這樣就可以避免出現上面的文件啦)

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章