我最近才添加了一个`.gitignore`文件来忽略子目录中的一些特定数据文件。我真的希望能够回到过去并将它们从之前的提交/历史记录中删除。
这个很容易实现吗?我应该从哪里开始?
这个很容易实现吗?我应该从哪里开始?
这将是一个两步过程:
为了使此方法起作用,早期提交必须包含您的.gitignore
文件。所以,您需要:
git checkout -b temp $(git rev-list HEAD | tail -1)
.gitignore
文件。git commit --amend
现在,您可以通过此命令自动从所有分支中删除这些文件:
git filter-branch --tree-filter 'git clean -f -X' -- --all
这将重写所有分支以删除被忽略的文件。这可能需要一段时间,具体取决于您的存储库大小。
git filter-branch --tree-filter
的文档中得知:新树将原样使用(新文件自动添加,消失的文件自动删除 - 既不受.gitignore文件的影响,也不受任何其他忽略规则的影响!)。 - kdbgit clean -f -X
树过滤器脚本所处理的内容。 - cdhowiefilter-branch
命令在历史开始时引入了我的.gitignore
文件,并将其应用于所有之前的提交记录。git filter-branch --tree-filter 'git rm --cached -rf . >/dev/null ; cp ~/Desktop/new-gitignore .gitignore ; git add . ; git clean -d -X -f >/dev/null' -- --all
正如您所看到的,这里假定您的桌面上有一个想要的 .gitignore
文件的副本 (~/Desktop/new-gitignore
).
我发现只有在我删除并重新添加所有文件 (git rm ...
, git add .
) 后,git clean
才会删除新的 .gitignore
告诉它忽略的所有文件。请注意,在清理后不必再次添加文件,因为 tree-filter
将一切都提交。
我在脚本中包含了 >/dev/null
以减少输出,但如果您想查看整个过程,可以安全地将其删除。
使用 filter-branch
查看类似下面的内容
git filter-branch --tree-filter 'rm -f passwords.txt' HEAD
git filter-branch 是一种可能的解决方案。在使用它之前,请确保您理解其影响,因为更改是永久性的。您将无法轻松地将过滤后的分支与旧分支合并。
git filter-branch --index-filter 'git rm --cached --ignore-unmatch 文件名' HEAD
将文件名替换为您想要删除的特定文件。