使用git filter-branch删除先前提交的所有文件

时间:2017-05-27 23:38:39

标签: git github

在我的github项目中我犯了大错,我忘了在开始时添加.gitignore,并且更多文件被添加到我的仓库中。现在我已经添加了.gitignore,其中有很多文件和目录。我在此之前完成了很多提交,现在我想用命令git filter-branch --tree-filter 'rm -f passwords.txt' HEAD从repo中删除所有不需要的文件。此命令从以前的所有提交中删除password.txt,但我有两个问题:1)如果我要删除.gitignore中的所有文件该怎么办?在rm之后我必须要写什么? 2)输入此命令后,git写信给我:" master branch和' origin / master'有分歧。使用git pull .... "。我没有使用此命令,我只使用git push -u。请解释一下我的布兰奇发生了什么事?为何分歧?的 P.S。我和我的项目一起工作,只有一个分支 - 主人

2 个答案:

答案 0 :(得分:0)

  1. 如果.gitignore仅列出文件(不是目录或模式),则命令应为 rm -f `cat .gitignore` 我建议将.gitignore复制到git树中的文件中,以避免git在过滤提交时更改文件。所以: cp .gitignore ../gitignore git filter-branch --tree-filter 'rm -f `cat ../gitignore`' rm ../gitignore

  2. 关于第二个问题 - git filter-branch(像任何其他提交编辑命令一样 - 修改,rebase等)创建新的提交,真正的全新分支,所以你不能只是推送过滤科。您必须使用git push -f origin mastergit push origin +master强制推送它。

答案 1 :(得分:0)

您应该使用git filter分支, 假设您要删除先前提交中的所有目标/目录,则只能运行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