美文网首页大前端刷级之路收藏问题iOS
git如何忽略已经提交的文件 (.gitignore文件无效)

git如何忽略已经提交的文件 (.gitignore文件无效)

作者: 元亨利贞o | 来源:发表于2016-11-06 12:51 被阅读6347次

    一. 问题
    在初始化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 "删除不需要的文件"
    1. .gitignore文件中添加忽略规则
    • (1) 在.gitignore文件中添加ignore条目, 如: some/path/some-file.ext
    • (2) 提交.gitignore文件: git commit -a -m "添加ignore规则"
    1. 推送到远程仓库是ignore规则对于其他开发者也能生效: git push [remote]

    tips: 上述步骤针对已经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规则, 如下:

    1. git rm -r --cached 要忽略的文件 (如: git rm -r --cahced build/*, 如修改列表中的内容全部是不需要的, 那么你可以使用最最简单的命令搞定git rm -r --cached .)
    2. git add .
    3. git commit -m " commet for commit ....."
    4. git push

    push之后其他开发人员pull之后, ignore规则就对其生效了.

    tips: 上述步骤只针对已经commit过且有改动的文件 (因为rm的是cached列表中的文件, cached列表即修改列表)

    三. 总结

    1. 最好创建git仓库的同时创建.gitignore文件, 并且把忽略规则写好(尽量考虑到所有应该略的文件, 这样就可以避免出现上面的文件啦)

    references:
    git忽略已经被提交的文件
    "git rm" 和 "rm" 的区别

    相关文章

      网友评论

      • 蜿蜒花骨朵:用git rm sdsds.a 删掉了.a 文件,我的本地代码就没法运行了呀,我没看明白
      • 蜿蜒花骨朵:我项目中有一个.a 文件过大,我上传GitHub时候想把他过滤掉,用 .gitignore 把它写进去,push 时候还是失败,警告有大文件.a 我怎么操作??
      • Simon_Zhang:使用git rm -r --cached 要忽略的文件这种方式,看你的意思是每次提交的时候都需要来一次。 那太不合理了!!
        元亨利贞o:@Simon_Zhang 对的, 正是这个意思:smile:
        Simon_Zhang:@元亨利贞o 嗯,我理解这句话的意思是指吧当前的已追踪但是还是没有提交的文件移除。 是这个意思吗?
        元亨利贞o:并不是每次都需要来一次这条命令, 这条命令删除不必要的文件后再添加忽略规则就会一直生效的:smile:

      本文标题:git如何忽略已经提交的文件 (.gitignore文件无效)

      本文链接:https://www.haomeiwen.com/subject/rnzguttx.html