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


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

git rm mylogfile.log

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

如何从repo中删除此文件  删除我的文件的本地副本?


2439
2017-07-17 14:56


起源


重复 停止跟踪并忽略Git中文件的更改


答案:


对于单个文件:

git rm --cached mylogfile.log

对于单个目录:

git rm --cached -r mydirectory

3508
2017-07-17 14:57



谢谢!我不确定我是如何错过这个...“当给出--cached时,分阶段的内容必须匹配分支的尖端或磁盘上的文件,允许从索引中删除文件“。 - mveerman
也许是因为它不像自我解释那样 --keep-local。 - Martin
@DGGenuine, --keep-local 是一个论据 svn rm - bdonlan
@bdonian谢谢。必须是新git-rm版本的选项。具有讽刺意味的是,这个页面是Google搜索“git rm”--keep-local'时的最佳结果 - Carl G
但是我如何保留远程服务器上的文件?这保留了我的本地服务器,但是如果我从另一台服务器推送,那么该文件将被删除。我还为该文件添加了一个.gitignore,但它仍然被删除了 - spankmaster79


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

git rm -r --cached folderName

我已经提交了一些resharper文件,并且不希望这些文件持续存在于其他项目用户。


249
2018-04-04 18:14



只是未来访问者的附加说明:不要使用GUI将提交“同步”回到回购。这会将文件拉回到您的本地仓库。你必须做一个 Git Push repo branch 实际上从远程文件中删除文件。 - RubberDuck
@RubberDuck答案3岁,唯一适用于我的解决方案:)谢谢 - Mariusz


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

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

或者,在Windows Powershell上:

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

163
2018-01-31 10:05



在Windows上不起作用。 git ls-files -i -X .gitignore有效,但我不知道如何将文件发送到'git rm'。你知道怎么做吗? - Erik Z
如果您使用Git Bash而不是cmd-console,则可在Windows上运行 - Andreas Zita
喜欢这个。工作,除了我有一些文件最终在文件名中有空格。我在这里修改了解决方案: git ls-files -i -X .gitignore | xargs -I{} git rm --cached "{}"。请考虑在此处修改或添加此解决方案,因为它是一个很好的工具... - mpettis
我没有尝试,但应该测试它会删除文件之类的 .gitkeep 它保留了存储库中的空文件夹。例如。 .gitignore 包含文件夹 uploads 并且回购被迫跟踪 .gitkeep。通过删除所有回购下 uploads 它也会删除 .gitkeep。 - Vladimir Vukanac
注意:不适用于嵌套的.gitignore文件 - acidjunk


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


66
2017-08-21 12:16



此答案应包括完成此任务所需的命令,而不是链接到其他网站。 - Florian Lemaitre


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

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

要从下一次提交中忽略该文件夹,请在root中命名一个文件 的.gitignore   并将该文件夹名称放入其中。您可以根据需要添加任意数量

的.gitignore 文件看起来像这样

/FolderName

remove directory


58
2017-08-24 12:16



出于好奇,你是如何模糊的? - kmort
@kmort哈哈,我使用谷歌Chrome浏览器的“真棒截图”工具做到了,真的很快,这就是为什么看起来凌乱。对不起!! awesomescreenshot.com - eirenaios


更通用的解决方案:

  1. 编辑 .gitignore 文件。

    ECHO mylogfile.log >> .gitignore

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

    git rm -r -f --cached .

  3. 重建索引。

    git add .

  4. 进行新的提交

    git commit -m "Removed mylogfile.log"


54
2017-12-13 11:42



这会实际删除文件吗? - Mr_and_Mrs_D
来自GitHub?没有。如果你已经推送到github,它将不会从网站上删除它。但它会更新您当地的git存储库。 - mAsT3RpEE
我想你想要这个: help.github.com/articles/remove-sensitive-data - mAsT3RpEE
你删除的评论实际上更加消除:)解决方案的问题 rm --cashed 当一个人拉动时它最终会删除文件 - 对吗?当他们说“从存储库中删除文件”时,这不是人们想要的 不从本地文件系统中删除它“。现在为什么上面接受的解决方案超出了我的范围 - 可能是OP单独工作而且从未拉过?Dunno。我理解github”曾经一直推到那里“问题 - Mr_and_Mrs_D
我的问题不是github - 就是这样 当他们拉动时,该文件实际上会从同事中删除。一世 别 想要删除该文件。这在过去引起了我很大的问题。所以我想知道是否真的有一个真正的解决方案 才不是 删除文件。另见评论小组接受的答案: stackoverflow.com/questions/1143796/... - Mr_and_Mrs_D


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

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

因此,不要删除它,而是永远忽略对它的更改。 我认为这只适用于本地,所以除非他们运行与上面相同的命令,否则同事仍然可以看到它的变化。 (但仍需要验证这一点。)

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


18
2018-01-28 11:46



嗯,我这样做但是我发现如果其他人在回购邮件上对其进行了更改,则可以覆盖该文件。 - AlxVallejo


以上答案对我不起作用。我使用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

4
2018-01-12 13:59



这结合了 git rm -r --cached NAME 是从当地的git repo中删除它并防止它影响以后拉的人(通过从git中删除文件或目录的历史记录)的技巧。 - notbad.jpeg
这会重写git历史记录,你需要推送--force after,这有点超出了我的猜测范围。在公共着名的回购中,你不能只改变那样的历史记录,因为每个已经克​​隆回购的人都会在拉动时遇到问题。 - Guillaume Perrot
谢谢,最后有人在没有任何外部工具的情况下解释了旧的一步一步的方法 - realtebo