从所有提交中删除文件

时间:2016-01-31 15:31:35

标签: git delete-file

我上传了一个字体文件,我没有权利在几个更新前分发给git hub。我有一个相对不活跃的存储库,我有能力在必要时通知我的所有成员。我尝试了几种解决方案。我需要删除名为Resources\Video\%font%.ttf的目录中的文件,其中%font%是字体的简单,斜体和粗体版本的名称。我使用什么命令?

5 个答案:

答案 0 :(得分:33)

在这种情况下,您可以使用带有--tree-filter选项的Git Filter Branch命令。

语法为git filter-branch --tree-filter <command> ...

git filter-branch --tree-filter 'rm -f Resources\Video\%font%.ttf' -- --all

关于命令的说明:

<强>&LT; command&gt;:指定任何shell命令。

<强> - 树滤波器: Git会检查每个提交到工作目录,运行你的命令, 并重新提交。

<强> - 所有 过滤所有分支中的所有提交。

注意:请检查文件的路径,因为我不确定文件路径

希望这能帮到你!!!

答案 1 :(得分:7)

根据 git 官方文档,使用 git filter-branch is strongly discouraged,推荐的方法是使用贡献的 git-filter-repo 命令。

Install 它(通过包,或使用包 python3-pip,执行 pip install)。

驱魔命令filename is then

git filter-repo --invert-paths --path filename

--invert-paths 选项表示排除,不包括以下路径。

答案 2 :(得分:2)

从所有提交中删除文件

git filter-branch --prune-empty --index-filter "git rm --cached -f --ignore-unmatch NAME_OF_FILE_YOU_WANT_TO_REMOVE"  --tag-name-filter cat -- --all

从所有提交中删除整个目录

git filter-branch --prune-empty --index-filter "git rm --cached -rf --ignore-unmatch NAME_OF_DIRECTORY_YOU_WANT_TO_REMOVE" --tag-name-filter cat -- --all

您可以检查,包括文件在内的提交已被修改,并且仅从日志中删除了该文件的提交。使用 gitkgit log 检查。


所用选项的说明

--prune-empty

  • 删除由于过滤操作而变为空的提交(即,不更改树)。在典型情况下,此选项会生成更清晰的历史记录。

--index-filter

  • 主要事件并在历史记录的每一步都针对索引运行。你想删除哎呀。 iso 无论在哪里找到,但它并不存在于所有提交中。命令 git rm --cached -f --ignore-unmatch oops.iso 删除存在的 DVD-rip,否则不会失败。

--tag-name-filter

  • 描述了如何重写标签名称。 cat 的过滤器是身份操作。您的存储库(与上面的示例一样)可能没有任何标签,但为了全面通用,我包含了此选项。

--

  • 指定 git filter-branch 选项的结束

--all 关注 --

  • 是所有 refs 的简写。您的存储库,就像上面的示例一样,可能只有一个 ref(主),但为了全面通用,我包含了这个选项。

-r

  • 递归删除目录中的所有内容

source

答案 3 :(得分:0)

git filter-branch --index-filter 'git rm --cached --ignore-unmatch Resources\Video\%font%.ttf' HEAD--tree-filter快得多(最高100倍),因为它仅更新git历史记录而不更新工作目录。

ref:What is the difference between "--tree-filter" and "--index-filter" in the "git filter-branch"?
参考:https://git-scm.com/docs/git-filter-branch

答案 4 :(得分:0)

我正在尝试:从存储库中删除敏感数据和历史记录,

在尝试上述解决方案时。我找到了这个youtube视频,它对我有效: 以video为参考:

命令: 我们需要在以下命令中以git根目录和文件的用户相对路径形式运行此命令。

$ git filter-branch --index-filter 'git rm --cache --ignore-unmatch /root-app/props/password.properties' HEAD

输出:

$ git filter-branch --index-filter 'git rm --cache --ignore-unmatch ./root-app/props/password.properties' HEAD
Rewrite 7243bb0ad4f3aca3a35e2b5ca86926856e77b666 (14860/14864) (1011 seconds passed, remaining 0 predicted) rm 'root-app/props/password.properties'
Rewrite 36c00b1203edf35321c0a0204e2fcb6341a5436d (14860/14864) (1011 seconds passed, remaining 0 predicted) rm 'root-app/props/password.properties'
Rewrite d6bf5d98ec548113f47b9dc7b6dcecf357fdf8db (14860/14864) (1011 seconds passed, remaining 0 predicted) rm 'root-app/props/password.properties'

我希望它也对其他人有用。