如何删除除当前文件以外的Git历史记录

4

如何删除除HEAD(我的主分支)上当前存在的文件之外任何分支上的所有内容的完整历史记录?

我一直在做以下这些事情:

 git filter-branch -f --prune-empty --index-filter \
    "git rm -rf --cached --ignore-unmatch '*.js' '*.html' '*.css'" \
        HEAD

但这变得很繁琐,因为我必须明确指出要删除什么,而不是要保留什么。

Git原则上应该能够确定当前文件的所有祖先,回溯历史,并删除不在祖先中的所有内容。如何实现?

我放弃了:这个整个历史重写似乎非常脆弱,会搞乱事情。很糟糕。我只是复制文件,忍受失去历史的代价。


只是出于好奇:你为什么需要这个?这似乎是一个相当不寻常的想法。 - sleske
为什么不使用rebase平整历史呢?与其肢解历史记录,不如让它不再痛苦。 - Dan D.
@dan-d:整个意图就在于现在在 HEAD 中保留文件历史记录。否则,我可以从头开始创建一个新的存储库并复制文件。或者我理解错了吗? - oberstet
@sleske:存储库的多个部分已被拆分为自己的存储库。但是,这些被拆分的部分已被大量重命名(目录和文件),因此无法仅使用“--subdirectory-filter”。 - oberstet
你可以在这里找到很多好的答案:https://dev59.com/vmMm5IYBdhLWcg3wDrtR - exstral
1个回答

1
为什么不先删除所有文件,然后再添加想要的文件?大概可以这样操作:
git ls-files HEAD > /tmp/files
git filter-branch ... --index-filter \
  "git rm *; xargs -a /tmp/files git add" --all

此外,如果你想过滤所有分支(--all),为什么在你的filter-branch命令中要使用HEAD呢?

谢谢你提供 --all 提示。你的建议是否会保留未被删除文件的历史记录? - oberstet
注意:你需要使用 -- --all。其他的不起作用。所以是 git filter-branch -f --prune-empty --index-filter "git rm -rf --cached --ignore-unmatch '*.js'" -- --all 例如。 - oberstet

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接