繁体   English   中英

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

[英]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

  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 (就像任何其他提交编辑命令 - amend、rebase 等)创建新的提交,真的是一个全新的分支,所以你不能只是推送过滤的分支。 您必须使用git push -f origin mastergit 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.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM