2011-06-30 38 views
141

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

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

+0

未来的Google可能会发现这非常有用。简洁和重点:https://www.git-tower.com/learn/git/faq/ignore-tracked-files-in-git –

回答

235

不,你不能强迫一个已经承诺在回购一个文件,因为它被添加到.gitignore

你必须git rm --cached删除您不想在文件只是删除回购。 (--cached因为你可能希望保留本地副本,但在回购协议中删除。)所以,如果你想从你的回购协议中删除所有的exe的做

git rm --cached /\*.exe 

(请注意,星号*从报价外壳 - 这让git,而不是外壳,扩大文件和子目录的路径名)

+0

这是否意味着我已经单独删除每个.exe –

+5

@Madhur Ahuja其实如果你做'git rm/\ *。exe'它会删除你的回购中的所有exe文件 – manojlds

+3

/\的目的是什么? – Costa

23

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

即使与现有的.gitignore号您可以到舞台“忽略”文件与-f(力)标志。如果他们的文件已经被提交,他们不会被自动删除。

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

这是否意味着我已经单独删除每个.exe –

+0

您可能能够批处理这个,但我不知道这是如何工作在windows下 – KingCrunch

5

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

'最好' 的食谱做,这是使用git filter-branch作为写在这里:

的git的过滤分行手册页包含全面的例子。

注意你会重写历史。如果您发布了包含意外添加的文件的任何修订版本,这可能会给这些公共分支机构的用户带来麻烦。通知他们,或者想想你需要删除文件的程度。

注意在存在标签的情况下,请始终使用--tag-name-filter cat选项至git filter-branch。它永远不会伤害,并且当你意识到以后需要它时,将会为你节省头痛

+0

我运行了这个命令,它显示Rewrite 57c1f1f04a3ed01f50c3260714cfc82c973ac816(3/3) 警告:Ref'refs/heads/master'保持不变并且什么也没有发生 –

+0

这是一个警告,很可能意味着master分支没有(还)包含任何修改与文件被删除。你可以很容易地检查。如果有问题,请更新问题。 ** PS:**使用 - '--all'一次重写所有(本地)分支 – sehe

+0

该链接似乎不再活跃... – Noctis

1

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

5

我不得不删除。想法和目标文件夹以及读这个工作对我来说所有的意见后:

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

,然后按掌握

1

如果你还没有推变化已经:

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