从Git仓库中删除一个文件但不在本地文件系统中删除它

3832

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

git rm file_to_remove.txt

这将从代码库中删除该文件,同时也会从本地文件系统中删除该文件。如何从代码库中删除该文件,而不删除我本地的文件副本?


4
如何在 Git 中停止跟踪和忽略文件的更改?原文链接:Stop tracking and ignore changes to a file in Git - user456814
52
值得注意的是,最受欢迎的答案对一些人来说是危险的。如果您正在使用远程仓库,则当您推送本地更改后,在其他地方拉取时,那些您从Git中删除的文件将会被删除。这在其中一个回复中提到了,但没有进行评论。 - RichieHH
2
请按照正确的方式操作:https://dev59.com/9lMH5IYBdhLWcg3w92It - goofology
1
重要警告:请在粘贴已接受的答案之前阅读此答案。https://dev59.com/lnM_5IYBdhLWcg3w-4dg#67793572 - Zahid Khan
据我所见,该链接的问题没有被接受的答案。那么正确的做法是什么?@goofology - a06e
正如您所看到的,根据所需的最终结果和适用于公共/共享存储库与私有存储库的后果,有许多不同的变体。关于链接的问题,我认为两个答案都可以 - 得票最高的是我的答案,但被接受的答案使用了一种在我编写解决方案时不存在的新方法。我没有尝试过被接受的答案。 - goofology
15个回答

6

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


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

git rm --cached filename

这个答案的作用是什么?

它的作用是从本地暂存区中删除一些你之前错误提交的文件,

  1. 如果没有将其推送到远程。
  2. 如果已经推送到远程,其他人也不关心这些更改。

通过移动文件的跟踪未跟踪状态,我的意思是,它会删除文件,然后再次添加它们。

所以,Git 就不再知道这些文件了。


会发生什么问题?




为什么?



摘要: 如果你从暂存区中删除了文件然后推送它们,将导致协作团队本地仓库中的文件也被删除( , 将会 )。

4
如果没有其他解决方案,这只是一个(非常重要的)评论而不是答案。 - Brian Z
但是,Git 不会保留这个文件的历史记录吗?我的意思是,我们总是可以回退到以前的版本吧? - Raynal Gobel
@RaynalGobel 是的,git 有所有历史记录可用,并且您可以随时还原。但问题是,你应该这样做吗?比如说,当你在本地有那个文件时,你删除了你的合作者的文件?就我的情况而言,领导信任我并盲目地合并我的 PR。该应用在他的机器上无法正常工作,而在我的机器上可以。想想这种情况! - Zahid Khan
1
同意@BrianZ的观点,这是一个非常重要的评论。如果能提出正确的做法建议,那就更好了! - a06e
题主的问题正是关于从仓库中移除文件的。我认为这个答案不合适。 - clapas

1

1

我使用了以下简单的方法从git中删除一些与IDE相关的文件,因为它们使得仓库看起来杂乱无章。

注意:这不会从git历史记录中删除它们。

注意:如果您意外提交了密码,第一件事就是更改这些密码。

  • 提交或还原任何本地更改。
  • 将文件在本地备份到另一个文件夹中。
  • 从本地repo中删除文件。
  • 提交删除文件的更改。
  • 编辑您的.gitignore文件以列出文件/文件夹。
  • 将文件在本地复制回其原始位置。
  • 运行git status并检查文件是否未列出。
  • 提交对.gitignore的更改

但是当贡献者拉取您的更改时,他们本地版本的文件将被删除。 - undefined

1
这取决于您所说的从git中“移除”的含义。 :)
您可以使用git rm --cached (更多详细信息)取消暂存文件。当您取消暂存某个文件时,这意味着它不再被跟踪,但这并不会从以前的提交中删除该文件。
如果您想做更多事情,例如从所有先前的提交中删除敏感数据,则需要使用诸如BFG Repo-Cleaner之类的工具过滤分支。

-1
如果您想在代码库中删除一个文件,但不删除文件系统中的文件,这意味着您不想保留该文件的痕迹。在Git中,您有4种选择(如此处所指定)。
  1. 您可以使用.gitignore文件。在这种情况下,文件/文件夹在本地是未跟踪的。
  2. 您可以以类似的方式编辑.git/info/exclude文件。这里的区别是文件在本地是未跟踪的。
  3. 您可以使用git update-index assume-unchanged <filename>命令来跟踪一个文件,但会忽略本地更改。
  4. 您可以使用git update-index skip-worktree <filename>命令来跟踪一个文件,但会忽略本地更改。
点3和点4似乎做着相同的事情,但它们有所不同。在这个链接中,你可以找到关于这些点行为的详尽测试列表。总结这些差异,我们可以说标志assume-unchanged假设开发人员不再修改文件。标志skip-worktree指示git不再修改特定的文件。当你向代码库添加一个配置文件,但又不想追踪它的更改时,这个标志非常有用。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接