![](/img/trans.png)
[英]git filter-branch - discard the changes to a set of files in a range of commits
[英]Delete all files from previous commits with git filter-branch
在我的 github 项目中,我犯了一个大错误,我忘记在 start 中添加 .gitignore ,并且更多的文件被添加到我的 repo 中。 现在我添加了 .gitignore ,其中有很多文件和目录。 在此之前我已经完成了很多提交,现在我想使用命令git filter-branch --tree-filter 'rm -f passwords.txt' HEAD
从 repo 中删除所有不必要的文件。 此命令从所有以前的提交中删除 password.txt,但我有两个问题:1) 如果我想删除 .gitignore 中的所有文件怎么办? 在rm
之后我必须写什么? 2) 输入这个命令后,git 给我写信:“ master 分支和‘origin/master’有分歧。使用 git pull.... ”。 我没有使用这个命令,我只是使用git push -u
。 请解释一下我的分支发生了什么? 为什么会出现分歧? Ps 我单独处理我的项目并且只有一个分支 - master
如果您的 .gitignore 仅列出文件(而不是目录或模式),则该命令应该是
rm -f `cat .gitignore`
我建议将您的 .gitignore 复制到 Git 树之外的文件中,以避免 Git 在过滤提交时更改文件。 所以:
cp .gitignore ../gitignore git filter-branch --tree-filter 'rm -f `cat ../gitignore`' rm ../gitignore
至于第二个问题 - git filter-branch
(就像任何其他提交编辑命令 - amend、rebase 等)创建新的提交,真的是一个全新的分支,所以你不能只是推送过滤的分支。 您必须使用git push -f origin master
或git push origin +master
强制推送它。
你应该使用 git filter branch,假设你想删除之前提交中的所有目标/目录,你可以只运行 4 个命令来实现:
$ git filter-branch --tree-filter 'rm -f */target' HEAD
$ rm -rf */target (you use this one to delete target/ dirs on current HEAD)
$ git commit -am 'delete all target/ dirs' --allow-empty
$ git push
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.