原来 gitignore 的文件夹去除后提交推送,然后反悔了想把这个文件夹继续放到 ignore 里,怎么操作?

2016-06-13 15:52:26 +08:00
 whistle

为什么我再加到.gitignore 里以后还是不行,并且我在 git 上删除了这个目录提交推送后还是可以正常跟踪这个目录里的文件变化?

并且这个目录里面很多文件,导致了现在 clone 时需要下载好多的 git 日志文件,有方法清除吗?

3932 次点击
所在节点    GitHub
3 条回复
SpicyCat
2016-06-13 16:36:38 +08:00
已经被 git 追踪的文件,简单地把文件名加到 .gitignore 里是无法取消追踪的。
你在 .gitignore 里追加一个文件夹名字,那么这个文件夹下面新建的文件都不会被追踪,但是之前已经被追踪的文件,还是会被 git 追踪。
想要取消追踪,有两个方法,一个简单只是治标,一个复杂但是治本。

简单的就是 git rm xxx ,如果需要记得先备份。这个就是把文件从本地已经 git 仓库中删除,之后你再追加这些文件,.gitignore 就起作用了。但是这些文件依然存在于历史记录中,用 git log 依然能查看到,如果你不慎加入的是个大文件(比如视频)或者敏感文件(比如存了密码),那么这种方法并不适用。因为代码仓库占用的磁盘空间并不会变小,而敏感文件的内容依然可以从 log 中看到。

复杂的就是遍历一遍 commits, 重写每个包含目标文件的 commit ,把该文件从所有 commit 里删除。这种删除比较彻底。如果你之前没有 push 过,那么这种方式使用后,你再 push ,别人不会感觉到你曾经误加过文件。
这个工作推荐你用工具来做:

https://rtyley.github.io/bfg-repo-cleaner/

我用的是这个。

如果你更倾向用 git 本身的命令来解决这个问题,也能实现。
如果你误加文件的 commit 是最近提交的,并且数量不多,那么可以用 git rebase -i 手动更改每个有问题的 commit 。事实上,即使有问题的 commit 比较多,只要你有耐心, git rebase -i 理论上也能解决问题。
如果你误加文件的 commit 比较多也比较久远,或者你根本记不得是哪个 commit ,那么可以用 git filter-branch ,具体可以参照这个链接

http://stackoverflow.com/questions/307828/completely-remove-file-from-all-git-repository-commit-history

这则问答涵盖了所有可能的方法。
whistle
2016-06-13 17:22:01 +08:00
万分感谢,我试试这个 bfg
MezY
2016-06-24 11:44:52 +08:00
学习了

这是一个专为移动设备优化的页面(即为了让你能够在 Google 搜索结果里秒开这个页面),如果你希望参与 V2EX 社区的讨论,你可以继续到 V2EX 上打开本讨论主题的完整版本。

https://www.v2ex.com/t/285372

V2EX 是创意工作者们的社区,是一个分享自己正在做的有趣事物、交流想法,可以遇见新朋友甚至新机会的地方。

V2EX is a community of developers, designers and creative people.

© 2021 V2EX