从Git历史记录中删除特定文件及其历史记录

从Git历史记录中删除特定文件及其历史记录,git,git-svn,Git,Git Svn,我想删除Git存储库中很久以前创建的特定文件的修订历史记录。目标是使文件看起来好像从未提交过特定的修订。有人知道怎么做吗?谢谢 听起来像是你想要的 P>但请务必考虑人页上的警告: 警告!改写后的历史将 所有对象都有不同的对象名称 对象和将不会与 原来的分支。你不会 能够轻松推送和分发 重写的分支位于 原始分支。请不要使用 如果您不知道 完整的含义,并避免使用它 无论如何,如果一个简单的单一提交 足以解决你的问题。 (见“从上游恢复” git REBASE(1)中的“REBASE”部分 有关重写的

我想删除Git存储库中很久以前创建的特定文件的修订历史记录。目标是使文件看起来好像从未提交过特定的修订。有人知道怎么做吗?谢谢

听起来像是你想要的

P>但请务必考虑人页上的警告:

警告!改写后的历史将 所有对象都有不同的对象名称 对象和将不会与 原来的分支。你不会 能够轻松推送和分发 重写的分支位于 原始分支。请不要使用 如果您不知道 完整的含义,并避免使用它 无论如何,如果一个简单的单一提交 足以解决你的问题。 (见“从上游恢复” git REBASE(1)中的“REBASE”部分 有关重写的更多信息 出版的历史。)

手册页的部分显示如何删除给定文件的历史记录。这应该是一个很好的起点

假设您要删除一个文件 (包含机密信息的) 或侵犯版权)从所有 承诺:

git过滤器分支--树过滤器'rm
filename'--all


如果您确实想从历史记录中删除提交,正如Tim Henigan所建议的那样,
过滤器分支
。然而,他从主页上引用的警告有很好的理由,而且很可能你能找到另一个解决方案

要反转单个提交的效果,只需使用:

git revert <commit>        # that's the SHA1 hash of the commit
git revert#这是提交的SHA1散列

这将在当前分支的基础上创建一个新的提交,它将撤消在指定提交中所做的所有更改。

谢谢,这看起来正是我需要的。请原谅我的无知,但在那个例子中,HEAD是我要删除的修订号吗?@Alexander:HEAD指定要重写哪个ref的历史记录。该示例尝试从HEAD的所有祖先中删除“坏”文件(在示例本身之后描述),该示例实际上不会重写任何分支。如果您真的想重写所有分支,可以用
--all
@Jefromi替换
HEAD
:谢谢您的更正。我更新了答案以匹配。还要注意文档中的警告,如果该文件在某些提交中不存在,
rm filename
将失败;因此,您可能需要
rm-f文件名