【问题标题】:How to remove Git history of anything but current files如何删除除当前文件之外的任何内容的 Git 历史记录
【发布时间】:2013-10-15 08:39:33
【问题描述】:

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

我一直在做类似的事情

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

但这越来越乏味,因为我必须明确指出要删除的内容,而不是保留的内容。

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

我放弃了:整个历史的改写似乎很脆弱,把事情搞砸了。糟透了。我只是复制文件并咬住丢失历史的子弹。

【问题讨论】:

  • 只是出于好奇:你为什么需要这个?这似乎是一个相当不寻常的想法。
  • 为什么不使用 rebase 来展平历史?与其破坏历史,不如让它摆脱痛苦。
  • @dan-d:嗯,重点是现在在 HEAD 中保存文件的历史记录。否则我可以简单地从头开始创建一个新的 repo 并复制文件。还是我理解错了?
  • @sleske:回购的多个部分被分解成自己的回购。但是分解出来的部分已经被重命名(目录和文件),所以没有办法只使用--subdirectory-filter
  • 你可以在这里找到很多好的答案:stackoverflow.com/questions/17901588/…

标签: git


【解决方案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 的提示。您的建议是否会保留未删除文件的历史记录?
  • 注意:您需要使用-- --all。另一个不起作用。所以它是git filter-branch -f --prune-empty --index-filter "git rm -rf --cached --ignore-unmatch '*.js'" -- --all 例如
猜你喜欢
  • 1970-01-01
  • 2020-06-06
  • 2011-03-10
  • 1970-01-01
  • 2018-01-13
  • 2017-10-01
  • 2017-06-16
  • 2013-03-31
  • 1970-01-01
相关资源
最近更新 更多