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

我想从我的存储库中删除一个文件。

git rm file_to_remove.txt

将从存储库中删除该文件,但它也会从本地文件系统中删除该文件。如何从存储库没有中删除此文件,删除文件的本地副本?

1076952 次浏览

#0留档:

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

因此,对于单个文件:

git rm --cached file_to_remove.txt

对于单个目录:

git rm --cached -r directory_to_remove

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

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

git rm -r --cached folderName

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

更通用的解决方案:

  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--sease-不变来完成的path/to/file.txt命令。一旦将文件标记为这样,git将完全忽略该文件上的任何更改;它们不会在运行git状态或git diff,它们也不会被提交。

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

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

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

要根据.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存储库中删除文件夹/目录或文件,而不是从本地try 3个简单的步骤。


删除目录的步骤

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

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

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

. gitignore文件看起来像这样

/FolderName

删除目录

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

如果您只想从本地和远程存储库取消跟踪文件和不删除,请使用此命令:

git update-index --assume-unchanged  file_name_with_path

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

注意:这不处理敏感信息的历史记录。

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

1)忽略文件

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

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

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

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

  • git add .
  • git commit -m"removal"

这取决于你从git中删除的意思。:)

您可以使用git rm--cache查看更多详细信息取消暂存文件。当您取消暂存某些内容时,这意味着它不再被跟踪,但这并不会从以前的提交中删除该文件。

如果您想做的不仅仅是取消暂存文件,例如从所有以前的提交中删除敏感数据,您将需要使用BFG回收清洁剂等工具查看过滤分支。

我想补充一下被接受的答案@陈志立


请勿使用此答案删除远程存在的文件。

git rm --cached filename

答案应该是什么?

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

  1. 也没有推到遥控器。
  2. 如果被推到远程,其他人并不关心这些变化。

它将文件从跟踪未跟踪状态移动,我的意思是,它删除文件并增加它们。

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


会出什么差错?

在远程,有这样的事情作为一个 𝐮𝐧𝐭𝐫𝐚𝐜𝐤𝐞𝐝 𝐬𝐭𝐚𝐭𝐞, 有 𝐨𝐧𝐥𝐲 𝐭𝐫𝐚𝐜𝐤𝐞𝐝 𝐬𝐭𝐚𝐭𝐞 ,导致浩劫。


为啥?

当与团队协作时,如果您将此类更改升级到远程,它将删除远程上的这些更改以及所有从 𝐫𝐞𝐦𝐨𝐭𝐞 𝐰𝐢𝐥𝐥 𝐜𝐚𝐮𝐬𝐞 𝐝𝐞𝐥𝐞𝐭𝐢𝐨𝐧 𝐨𝐟 𝐭𝐡𝐨𝐬𝐞 𝐟𝐢𝐥𝐞𝐬 𝐰𝐡𝐢𝐜𝐡 𝐲𝐨𝐮 𝐡𝐚𝐯𝐞 𝐣𝐮𝐬𝐭 𝐫𝐞𝐦𝐨𝐯𝐞𝐝 𝐣𝐮𝐬𝐭 𝐟𝐫𝐨𝐦 𝐬𝐭𝐚𝐠𝐞𝐝.获取更改的团队

总结:您从暂存中删除文件,然后推送它们将导致删除协作团队本地存储库中的文件 (𝘸𝘩𝘪𝘭𝘦 𝘺𝘰𝘶 𝘩𝘢𝘷𝘦 𝘵𝘩𝘰𝘴𝘦 𝘧𝘪𝘭𝘦𝘴 𝘢𝘷𝘢𝘪𝘭𝘢𝘣𝘭𝘦 𝘪𝘯 𝘵𝘩𝘦 𝘶𝘯𝘵𝘳𝘢𝘤𝘬𝘦𝘥 𝘴𝘵𝘢𝘨𝘦, 𝘧𝘰𝘳 𝘢𝘭𝘭 𝘵𝘦𝘢𝘮𝘴 𝘪𝘵 将 𝘨𝘰𝘯𝘦. )

由于rm --cache将删除远程存储库中的文件,您可以使用update-index代替
见:https://learn.microsoft.com/en-us/azure/devops/repos/git/ignore-files?view=azure-devops&; tabs=Visual Studio-2019