我需要从提交历史记录中删除文件。我跟着Github's instructions for removing sensitive data:
$ git filter-branch --force --index-filter \
'git rm --cached --ignore-unmatch <myfile>' \
--prune-empty --tag-name-filter cat -- --all
...但我一定做错了,因为现在我有一堆重复的提交。一组提交仍然有我的文件;另一个没有。除此之外,他们是完全相同的。如何删除仍包含文件的所有提交?
答案 0 :(得分:5)
据推测,您应用了filter-branch,然后从遥控器中拔出。当您git filter-branch
时,您确实复制了您的历史记录。除了应用的更改(在您的情况下是已删除的文件)之外,您创建一组与旧的提交相同的新提交。所有(或大多数)提交ID都会发生变化。你的改变只发生在当地。遥控器仍然有原始提交。现在你可能试图推动你的提交,但它说了一些关于“超级头”或你的历史“分歧”。通常要做的就是拉。通过这样做,您获取了原始提交并将它们合并到您重写的历史记录中。不应该拉你应该强行推动破坏性地覆盖你的遥控器的历史,git在没有-f的情况下拒绝这样做是有充分理由的。
答案 1 :(得分:5)
根据问题,现有答案及其评论的信息,原来的海报似乎在执行git filter-branch
后犯了一些错误,并且没有制作回购的备份克隆。 / p>
所以这里有关于将repo返回到filter-branch之前的状态的说明,如果这是原始海报想要做的事情。
git filter-branch
会自动保存对旧提交的引用,以防您因任何原因需要恢复它们。您可以在repo的.git/refs/original/refs/
目录下找到它们:
ls -l .git/refs/original/refs/heads/
total 1
-rw-r--r-- 1 Keoki Administ 41 May 23 01:13 master
ls -l .git/refs/original/refs/tags/
total 1
-rw-r--r-- 1 Keoki Administ 41 May 23 01:13 v1.0
以上每个引用都包含旧提交的提交sha ID:
cat .git/refs/original/refs/heads/master
276fc24dc4b12edf75aea40f4fd50e25a5840005
cat .git/refs/original/refs/tags/v1.0
475593a612141506f59a141e38b8c6a3a2917f85
要取回原来的master
分支(从你做过滤分支之前),只需使用上面的引用进行硬重置,或者使用其中包含的commit sha ID:
git checkout master
# Use reference
git reset --hard refs/original/refs/heads/master
# Or use sha ID
git reset --hard 276fc24dc4b12edf75aea40f4fd50e25a5840005