我有一个git仓库托管在Github上。在提交了许多文件后,我意识到我需要创建.gitignore并排除.exe, .obj文件。

但是,它会自动从存储库中删除这些已提交的文件吗?有办法强制吗?


当前回答

即使在您删除文件并提交之后,这些文件仍将保存在历史记录中。要删除这些,可以考虑使用BFG Repo-Cleaner。它是git-filter-branch的替代方案。

其他回答

不,你不能仅仅因为一个文件被添加到.gitignore就强制删除已经在repo中提交的文件

你必须git rm -cached来删除你不想在repo中使用的文件。(—缓存,因为您可能希望保留本地副本,但从回购删除。)所以如果你想删除所有的exe从你的回购做

git rm --cached /\*.exe

(注意,星号*是从shell中引用的-这让git而不是shell扩展文件和子目录的路径名)

但是,它会自动从存储库中删除这些已提交的文件吗?

不。即使使用现有的.gitignore,您也可以使用-f (force)标志来执行“被忽略”的文件。如果这些文件已经提交,它们不会被自动删除。

git rm --cached path/to/ignored.exe

我不得不删除。idea和目标文件夹,在阅读了所有的评论后,这对我来说是有效的:

git rm -r .idea
git rm -r target
git commit -m 'removed .idea folder'

然后推到主人

即使在您删除文件并提交之后,这些文件仍将保存在历史记录中。要删除这些,可以考虑使用BFG Repo-Cleaner。它是git-filter-branch的替代方案。

但是,它会自动从存储库中删除这些已提交的文件吗?

No.

“最好”的方法是使用git filter-branch,如下所示:

http://git-scm.com/book/en/Git-Internals-Maintenance-and-Data-Recovery#Removing-Objects

git-filter-branch的手册页包含了全面的示例。

你将改写历史。如果您发布了包含意外添加的文件的任何修订,这可能会给那些公共分支的用户带来麻烦。通知他们,或者考虑一下你有多需要删除这些文件。

注意:出现标记时,总是使用——tag-name-filter cat选项来git filter-branch。当你意识到你需要它的时候,它不会伤害你,也会让你免去头痛