3467

我的初始提交包含一些日志文件。我已添加*log到我的.gitignore,现在我想从我的存储库中删除日志文件。

git rm mylogfile.log

将从存储库中删除文件,但也会将其从本地文件系统中删除。

如何在删除文件的本地副本的情况下从存储库中删除此文件?

4

12 回答 12

4890

man 文件

--cached给出时,暂存的内容必须匹配分支的尖端或磁盘上的文件,从而允许仅从索引中删除文件。

因此,对于单个文件:

git rm --cached mylogfile.log

对于单个目录:

git rm --cached -r mydirectory
于 2009-07-17T14:57:26.933 回答
303

要从 repo 中删除整个文件夹(如 Resharper 文件),请执行以下操作:

git rm -r --cached folderName

我已经提交了一些 resharper 文件,并且不希望这些文件保留给其他项目用户。

于 2012-04-04T18:14:01.270 回答
239

您还可以根据您的 .gitignore 从存储库中删除文件,而无需从本地文件系统中删除它们:

git rm --cached `git ls-files -i -X .gitignore`

或者,在 Windows Powershell 上:

git rm --cached $(git ls-files -i -X .gitignore)
于 2014-01-31T10:05:47.310 回答
119

根据我的回答:https ://stackoverflow.com/questions/6313126/how-to-remove-a-directory-in-my-github-repository

要仅从 git 存储库而不是从本地删除文件夹/目录或文件,请尝试 3 个简单步骤。


删除目录的步骤

git rm -r --cached File-or-FolderName
git commit -m "Removed folder from repository"
git push origin master

在下一次提交中忽略该文件夹的步骤

要从下一次提交中忽略该文件夹,请在根目录中创建一个名为.gitignore的文件 ,并将该文件夹名称放入其中。你可以放多少你想放多少

.gitignore文件看起来像这样

/FolderName

删除目录

于 2015-08-24T12:16:36.007 回答
76

更通用的解决方案:

  1. 编辑.gitignore文件。

    echo mylogfile.log >> .gitignore

  2. 从索引中删除所有项目。

    git rm -r -f --cached .

  3. 重建索引。

    git add .

  4. 进行新的提交

    git commit -m "Removed mylogfile.log"

于 2013-12-13T11:42:32.020 回答
74

此外,如果您提交了敏感数据(例如包含密码的文件),您应该将其从存储库的历史记录中完全删除。这是一个解释如何做到这一点的指南:http: //help.github.com/remove-sensitive-data/

于 2011-08-21T12:16:36.180 回答
27

Git 允许您通过假设它们未更改来忽略这些文件。这是通过运行git update-index --assume-unchanged path/to/file.txt命令来完成的。一旦将文件标记为这样,git 将完全忽略该文件上的任何更改;它们不会在运行 git status 或 git diff 时出现,也不会被提交。

(来自https://help.github.com/articles/ignoring-files

因此,不要删除它,而是永远忽略对它的更改。我认为这仅在本地有效,因此除非他们运行与上述相同的命令,否则同事仍然可以看到对其的更改。(但仍需要验证这一点。)

注意:这不是直接回答问题,而是基于其他答案评论中的后续问题。

于 2014-01-28T11:46:49.627 回答
26

如果您只想取消跟踪文件而不是从本地和远程仓库中删除,请使用以下命令:

git update-index --assume-unchanged  file_name_with_path
于 2018-08-15T07:33:48.927 回答
10

忽略文件,从 git 中删除文件,更新 git(用于删除)。

注意:这不涉及敏感信息的历史记录。

这个过程肯定需要对 git 发生的事情有所了解。随着时间的推移,获得了这一点,我学会了执行以下流程:

1)忽略文件

  • 添加或更新项目.gitignore以忽略它们 - 在许多情况下,例如您的父目录,例如log/将是要使用的正则表达式。
  • 提交并推送该.gitignore文件更改(不确定是否需要推送,如果这样做没有害处)。

2)从 git 中删除文件(仅)。

  • 现在从 git (only) 中删除文件git rm --cached some_dir/
  • 检查它们是否仍然留在本地(它们应该!)。

3)添加并提交该更改(本质上这是对“添加”删除内容的更改,尽管“添加”命令令人困惑!)

  • git add .
  • git commit -m"removal"
于 2020-04-14T15:37:31.347 回答
8

以上答案对我不起作用。我曾经filter-branch删除所有提交的文件。

使用以下命令从 git 存储库中删除文件:

git filter-branch --tree-filter 'rm  file'

使用以下命令从 git 存储库中删除文件夹:

git filter-branch --tree-filter 'rm -rf directory'

这将从所有提交中删除目录或文件。

您可以使用以下命令指定提交:

git filter-branch --tree-filter 'rm -rf directory' HEAD

或范围:

git filter-branch --tree-filter 'rm -rf vendor/gems' t49dse..HEAD

要将所有内容推送到远程,您可以执行以下操作:

git push origin master --force
于 2016-01-12T13:59:01.167 回答
4

我想补充一下@bdonlan接受的答案。


不要使用此答案来删除远程存在的文件。

git rm --cached filename

答案应该做什么?

它应该从本地暂存区域中删除您在以前的某些提交中错误地提交的一些文件。

  1. 并没有推到远程。
  2. 如果远程推送,其他人不会关心这些变化。

它将文件从Tracked Untracked状态移动,我的意思是,它删除文件并再次添加它们。

所以,git 不再知道它们了。


会出什么问题?

在遥控器上,有一个 , there is and 之类的东西会导致严重破坏。


为什么?

与团队协作时,如果您对远程进行了此类更改,它将删除远程上的这些更改以及所有接受 from 的团队。

摘要:您从暂存中删除文件然后推送它们将导致协作团队的本地存储库中的文件也被删除(,将是。)

于 2021-06-01T17:35:12.313 回答
0

这取决于您从 git 中“删除”的意思。:)

您可以使用 git rm --cached 取消暂存文件,详情请参阅。当您取消暂存某些内容时,这意味着它不再被跟踪,但这不会从以前的提交中删除该文件。

如果您想做的不仅仅是取消暂存文件,例如从所有以前的提交中删除敏感数据,您将需要考虑使用BFG Repo-Cleaner等工具过滤分支。

于 2020-11-15T18:14:08.890 回答