5

我不小心将我无权访问的文件推送到可公开访问的存储库。

我该怎么做才能有选择地从回购中完全删除该单个文件,以使其数据完全消失?

4

2 回答 2

6

在这种情况下,Git Filter-Branch 是你的朋友,可爱的 Github 有很好的记录

于 2012-05-14T14:46:29.017 回答
2

假设您添加文件的提交是最新的:

git reset --hard HEAD^
git push --force

如果存储库中有更多提交,则可以使用交互式变基来消除该提交。git rebase -i xxxxxx你想要核对的那个之前使用作为一个提交。然后在编辑器中,删除包含“错误”提交的行。保存并退出编辑器后,该提交将永远消失。如果您无法删除整个提交,您可以在文件中替换pickedit并修改提交(例如从暂存区删除文件)然后运行git rebase --continue

但是,从您的仓库中提取的每个人都需要手动执行相同的变基。但是无论如何,该文件已经是公开的,您不应该重写历史记录来撤消您的错误。

除了所有变基,您还可以使用GitHub 帮助中git-filter-branch的描述来删除文件:

git filter-branch --index-filter 'git rm --cached --ignore-unmatch NAME_OF_THE_FILE' --prune-empty -- --all

当然,您也需要git push --force在此操作之后进行操作,因为它还会重写历史记录(如果有人从该存储库中提取并开始处理它,请注意所有警告)。如果您的仓库在 github 上,也不要忘记联系他们以清除您的仓库的缓存。

于 2012-05-14T14:43:45.897 回答