从 Git 存储库中删除文件,而不从本地文件系统中删除文件

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

git rm mylogfile.log

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

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

答案

man 文件中

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

因此,对于单个文件:

git rm --cached mylogfile.log

对于单个目录:

git rm --cached -r mydirectory

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

git rm -r --cached folderName

我已经提交了一些共享文件,并且不想让其他项目用户继续使用。

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

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

或者,或者,在 Windows Powershell 上:

git rm --cached $(git ls-files -i -X .gitignore)

根据我在这里的答案: 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

删除目录

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

更通用的解决方案:

  1. 编辑.gitignore文件。

    ECHO mylogfile.log >> .gitignore

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

    git rm -r -f --cached .

  3. 重建索引。

    git add .

  4. 进行新的提交

    git commit -m "Removed mylogfile.log"

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

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

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

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

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

git update-index --assume-unchanged  file_name_with_path

以上答案对我没有用。我使用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