如何从所有git提交中删除索引中文件的所有出现

时间:2016-07-29 04:07:03

标签: git caching github indexing commit

第一次在这里使用git。我不小心使用了" git init"没有.gitignore文件所以我在提交中有一堆gradle /和build / files。我正在使用" git ls-tree -r master"显示索引中的所有文件。而不是检查每一个先前的提交并使用" git rm --cached"删除所有不必要的构建和gradle文件,如何通过所有以前的提交删除它的所有出现?

编辑:有没有办法删除所有提交中的每个目录和文件,只保留src目录?

1 个答案:

答案 0 :(得分:1)

您可能确实需要filter-branch命令而不是rebase。无论哪种方式,有几个项目需要注意:

  • 您无法更改任何现有提交,永远
  • 因此,rebase和filter-branch都没有。相反,他们复制提交。现在你有两倍的提交!等等,什么?!
  • 但是Git可以并且最终会删除它所谓的未引用的对象(提交及其相应的文件),如果有必要,您可以通过各种方式加快速度。

这就是rebase和filter-branch所做的事情:它们复制提交,并在提交副本之前允许一些更改。然后,在提交了(略有不同的)副本后,他们将引用 - 分支和标记名称 - 移动到副本。

考虑到这一点,还有几个要考虑的事项:

  • 仅过滤分支副本和移动标记,只有在您提供--tag-filter时才会这样做。 (如果你没有标签,显然这并不重要。)而且,当过滤器分支副本签名带注释的标签时,它会丢弃它们的签名:它们变为无符号。否则,它将不得不纠缠你手动重新签名所有,而filter-branch旨在完全自动化。
  • 因为filter-branch被设计为自动化的,并且因为它被设计为能够在存储库中的每次提交时运行,所以它(a)往往很慢并且(b)有很多复杂的选项意味着加快速度。如果你没有那么多提交,这不是什么大不了的事。如果你这样做,那么研究如何使用它的许多选项来加速它是值得的。
  • 因为两个命令都复制了提交,如果其他人都有一个存储库的副本,那么你也要为它们做一堆工作:它们需要切换到副本。如果他们不这样做,他们可以重新引入所有原始提交,然后你又回到了两倍的数量。

现在您已准备好the linked question及其过滤分支答案。不过,有关使用--tag-name-filter和部分加速选项的说明,请参阅this other answer相关问题。

请注意git rm -f --cached --ignore-unmatch适用于目录(或“文件夹”)名称以及纯文件名。可以使用--tree-filter(在第二个链接页面上的其他答案中提到)代替--index-filter,它对于复杂操作更方便,但它很多更慢(确切的减速因操作系统,回购协议的大小,SSD与旋转媒体存储等等而有所不同,但“使用--index-filter比使用void someMethod(T object)要好”起约为100倍“。