从远程Git存储库中删除已经物理删除的文件的引用

9

我从我的Git仓库(来自多个目录)物理上删除了许多文件。

我仍然可以看到它们的引用,如果我提交到GitHub,旧文件仍然存在。

我需要从远程存储库服务器(GitHub)以及我的本地PC中删除这些引用。

如何从存储库中删除这些引用?


2
从下面不同的答案中,你可能会猜到你的问题有些歧义 - 你是想让这些文件根本不出现在你的GitHub存储库中,甚至不在历史记录中吗?还是你只是想在GitHub上删除它们的当前版本? - Mark Longair
4个回答

17
你需要创建一个“commit”(git术语,表示新版本),其中包含这些文件的删除,并将其推送到GitHub。我猜如果你输入git status,会看到如下内容:
# On branch master
# Changed but not updated:
#   (use "git add/rm <file>..." to update what will be committed)
#   (use "git checkout -- <file>..." to discard changes in working directory)
#
#   deleted:    old-file.txt
#   deleted:    another-old-file.txt
#   deleted:    unneeded.c
如果在git status输出的内容中没有列出其他更改,那么可以放心执行以下操作:
git add -u
git commit -m "Delete many old files"

...然后推送到GitHub。(命令git add -u的作用是将任何被Git跟踪的文件的更改暂存到下一次提交中,这将包括你手动从本地删除的这些文件。)

但是,如果该输出中列出了其他更改,最好尝试更精确的方法,例如此处建议的方法:

未来最好使用git rm命令直接删除文件 :)


4
如果你想从仓库的所有提交中删除一个文件,你需要使用git filter-branch。可以在互联网上找到许多使用它的示例,例如在GitHub上。

2
如果您要讨论删除文件并提交此删除,则应使用以下内容。
git rm filename

这个命令会删除文件本身并立即将其标记为待提交的删除状态。因此,在这种情况下,你只需要执行:
git commit -m "Remove files" #everything staged will be committed

顺便提一下,如果您想移动或重命名文件,也不要使用shell的移动命令,而是使用"git mv [源] [目标]"

现在,如果您在没有使用"git rm"的情况下删除了它们

您应该先将它们放入暂存区:

git add -u
git commit -m "Remove files"

现在,如果您想要让它们从整个历史记录中消失,以至于不再提及这些文件,那么您必须使用


git filter-branch 

Git filter-branch documentation

请注意,大多数情况下您实际上不需要使用filter-branch命令,因为它是相当高级的东西。最好的使用案例是,如果您已经提交了带有一些关键信息(如您的信用卡号和过期日期)的文件,并将此文件推送到公共存储库,则必须使用filter branch更改此值为某些无关紧要的值或删除文件不足够 - 您必须使用filter branch;) ...并祈祷没有人足够快地从您的存储库提取;) ...然后无论如何报告您的信用卡被盗...;)

0

它们应该显示为已删除的索引。只需将它们暂存,它们就会被删除。

使用 git add -i 可以使暂存过程更快。


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