提交后的.gitignore


210

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

但是,它将自动从存储库中删除这些已提交的文件吗?有什么方法可以强制这样做吗?


6
未来的Google员工可能会发现这非常有用。简洁明了:git-tower.com/learn/git/faq/ignore-tracked-files-in-git
Austin Dean

Answers:


331

不,您不能仅仅因为已将文件已添加到 .gitignore

您必须git rm --cached删除存储库中不需要的文件。(--cached,因为您可能想保留本地副本但要从存储库中删除。)因此,如果要从存储库中删除所有exe文件,请执行

git rm --cached /\*.exe

(请注意,星号*是从外壳引号引起的-这使git(而不是外壳)可以扩展文件和子目录的路径名)


6
@Madhur Ahuja实际上,如果您这样做git rm /\*.exe,它将删除您存储库中的所有exe文件
manojlds 2011年

4
/是做什么用的?
2014年

5
@Costa他们在那里躲避星号,以防止shell解释它的意图,因为它打算用于git
Lambart

2
警告:这些文件保存在本地,这是真的。但是运行a的其他用户git pull将看到其文件被删除。
ByScripts

42

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

否。即使已经存在,.gitignore您也可以使用-f(force)标志暂存“已忽略”的文件。如果这些文件已经提交,则不会自动删除它们。

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

这是否意味着我分别删除了每个.exe
Madhur Ahuja

您可能可以批量处理,但是我不知道在Windows下如何工作
KingCrunch 2011年

30

如果尚未推送更改:

git rm -r --cached .
git add .
git commit -m 'clear git cache'
git push

15

我必须删除.idea和目标文件夹,并且在阅读所有评论后对我有用:

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

然后推向高手


.idea是我的问题,我想这是你太:)
奥利维尔·庞斯

5

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

没有。

执行此操作的“最佳”方法git filter-branch如下:

git-filter-branch的手册页包含完整的示例。

注意您将重写历史记录。如果您发布了包含意外添加文件的任何修订,则可能给那些公共分支机构的用户带来麻烦。通知他们,或者考虑您需要多么严重地删除文件。

注意如果有标签,请始终使用--tag-name-filter cat选项git filter-branch。当您意识到以后需要它时,它永远不会伤害您,并且会为您省去头痛


我运行了该命令,结果显示Rewrite 57c1f1f04a3ed01f50c3260714cfc82c973ac816(3/3)警告:Ref'refs / heads / master'保持不变,没有任何反应
Madhur Ahuja,

这是一个警告,很可能意味着master分支尚未包含任何要删除文件的修订。您可以轻松地检查一下。如果有问题,请更新问题。PS:使用- --all一次重写所有(本地)分支
sehe 2011年

1

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

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.