我已经从我的 Git 存储库(来自许多不同的目录)中物理删除了很多文件。
我仍然可以看到他们的参考,如果我向 GitHub 提交,旧文件仍然存在。
我需要从远程 repo 服务器 (GitHub) 以及我的本地 PC 中删除这些引用。
如何从存储库中删除这些引用?
您需要创建一个“提交”(新版本的 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
:)
如果要从存储库的所有提交中删除文件,则需要git filter-branch
. 使用它的示例可以在整个互联网上找到,例如在GitHub 上。
如果您正在谈论删除文件并提交此删除,那么您应该使用
git rm filename
此命令将删除文件本身并立即将删除进行提交。因此,在这种情况下,您只需执行
git commit -m "Remove files" #everything staged will be committed
顺便说一句,当您想要移动或重命名文件时也是如此。不要使用 shell move 命令,而是使用“git mv [source] [destination]”
现在,如果您在不使用“git rm”的情况下删除了它们
你应该先上演它们:
git add -u
git commit -m "Remove files"
现在,如果您希望它们从整个历史记录中消失,因此不会提及这些文件,那么您必须使用
git filter-branch
请注意,大多数时候您实际上不需要使用 filter-branch 命令,因为它是非常高级的东西。最好的示例用例是,如果您提交了包含一些关键信息(例如您的信用卡号和到期日期)的文件,并将此文件推送到公共 repo。在这种情况下,将此值更改为一些不相关的值或删除文件是不够的 - 你必须使用过滤器分支;)......并祈祷没有人足够快地从你的回购中获取;)......然后报告你的反正信用卡被盗了……;)
它们应该在您的索引中显示为已删除。只需暂存它们,它们就会被删除。
使用 git add -i 使登台过程更快。