【问题标题】:How to remove file from Git history?如何从 Git 历史记录中删除文件?
【发布时间】:2017-10-01 10:05:32
【问题描述】:

前段时间我添加了必须是私有的信息(文件)。从项目中删除没有问题,但我还需要将其从git历史记录中删除。

我使用 Git 和 Github(私人帐户)。

注意:在this thread 上显示了类似的内容,但这是一个添加到功能分支的旧文件,该分支合并到开发分支并最终合并到主分支,因此,进行了很多更改.所以这是不一样的,需要的是更改历史记录,并隐藏该文件以保护隐私。

【问题讨论】:

标签: git github


【解决方案1】:

我找到了这个答案,它有所帮助:

git filter-branch --index-filter \
    'git rm -rf --cached --ignore-unmatch path_to_file' HEAD

在这里找到它https://myopswork.com/how-remove-files-completely-from-git-repository-history-47ed3e0c4c35

【讨论】:

  • 警告:这会产生大量提交并导致分歧。之后你可能不得不用力推,但我太害怕了。
  • 接着@sudo 所说的,但这确实适用于我不小心将.env 提交给的新分支。快速且切中要害的解决方案。
  • 确实,一个简单的强制推送就可以了!我也很害怕,但支持一切。
  • 您还可以指定提交范围作为最后一个参数。如果有问题的提交是最近的,请执行 <previous_hash>..HEAD 并节省一些时间。
  • 当前版本的 Git 对filter-branch 这么说:“警告:git-filter-branch 有大量的陷阱会产生错误的历史重写。在继续中止之前按 Ctrl-C,然后使用替代方法过滤工具,例如 'git filter-repo' (github.com/newren/git-filter-repo)。有关详细信息,请参阅 filter-branch 手册页;要消除此警告,请设置 FILTER_BRANCH_SQUELCH_WARNING=1。"
【解决方案2】:

如果您最近提交了该文件,或者该文件在一两次提交中发生了更改,那么我建议您使用 rebase 和 cherrypick 删除该特定提交。

否则,您将不得不重写整个历史记录。

git filter-branch --tree-filter 'rm -f <path_to_file>' HEAD

当您对更改感到满意并确保一切正常时,您需要更新所有远程分支 -

git push origin --force --all

注意:- 这是一项复杂的操作,您必须清楚自己在做什么。首先尝试在演示存储库上执行它,看看它是如何工作的。您还需要让其他开发人员知道这件事,这样他们就不会在此期间进行任何更改。

【讨论】:

  • 重写整个历史后,为了保持对仓库(github)的更改必须做什么?
  • 谢谢你,我会等着做,然后用一个演示库试试,我会在这里完成所有更新。
  • 一不小心忘了加--all。现在,每当我使用两个参数重新运行 push 时,它都会显示所有最新信息。并且该文件不会从其他分支中删除。我现在该怎么办?
  • 为什么你的建议使用--tree-filter 而不是@PetroFranko 的回答中的--index-filter?
  • 天哪,成功了!我的意思是这真的很简单。我以前做过很困难的事情,但这要容易得多。提示:路径需要是相对的。
【解决方案3】:

git-repo-过滤器

git推荐使用第三方插件git-filter-repo(git filter-branch命令执行时)。有一长串为什么它比任何其他替代品更好 (https://github.com/newren/git-filter-repo#why-filter-repo-instead-of-other-alternatives),我的经验是它非常简单且非常快速。

此命令从所有分支的所有提交中删除文件:

git filter-repo --path &lt;path to the file or directory&gt; --invert-paths

可以使用多个--path 参数指定多个路径。你可以在这里找到详细的文档: https://www.mankier.com/1/git-filter-repo

【讨论】:

【解决方案4】:

从您使用已删除文件完成的提交中删除文件并重写历史记录(这将从您提交的文件中创建新的提交哈希):

有两种方式:

  1. 使用git-filter-branch:

git filter-branch --force --index-filter 'git rm --cached --ignore-unmatch &lt;path to the file or directory&gt;' --prune-empty --tag-name-filter cat -- --all

  1. 使用git-filter-repo:
pip3 install git-filter-repo
git filter-repo --path <path to the file or directory> --invert-paths

现在强制推送 repo:git push origin --force --all 并告诉你的合作者rebase。

【讨论】:

  • @alper 您需要将PATH-TO-YOUR-FILE-WITH-SENSITIVE-DATA 替换为要删除的文件,例如:README.md 如果要删除它。
  • 您需要使用-rf 来删除文件夹
  • 对于git filter-repo:我收到以下消息:Aborting: Refusing to destructively overwrite repo history since this does not look like a fresh clone. (expected freshly packed repo) Please operate on a fresh clone instead. If you want to proceed anyway, use --force.。如果我强迫它,我会得到关注:fatal: 'origin' does not appear to be a git repository fatal: Could not read from remote repository.
  • git filter-branch 为我工作!
【解决方案5】:

我阅读了this GitHub article,它引导我执行以下命令(类似于接受的答案,但更可靠):

git filter-branch --force --index-filter "git rm --cached --ignore-unmatch PATH-TO-YOUR-FILE-WITH-SENSITIVE-DATA" --prune-empty --tag-name-filter cat -- --all

【讨论】:

  • 它比接受的答案更好,但它也会删除语言环境中的文件。如果您不想浪费时间重写,请在此之前将其复制。
【解决方案6】:

使用bfg repo-cleaner 包是git-filter-branch 的另一种可行替代方案。显然,它也更快......

【讨论】:

    【解决方案7】:
    • 首先,将其添加到您的 .gitignore 文件中,并且不要忘记提交该文件 :-)

    • 您可以使用此站点:http://gitignore.io 为您生成 .gitignore 并将所需的路径添加到您的二进制文件/文件夹

    • 将文件添加到.gitignore 后,您可以使用 BFG 删除“旧”二进制文件。


    #How to remove big files from the repository

    您可以使用git filter-branch 或 BFG。 https://rtyley.github.io/bfg-repo-cleaner/

    ###BFG Repo-Cleaner git-filter-branch 的替代品。

    BFG 是 git-filter-branch 的一种更简单、更快速的替代方案,用于从 Git 存储库历史记录中清除 不良数据:

    *** 删除疯狂的大文件***

    • 删除密码、凭据和其他私人数据

    示例(来自官方网站)

    在所有这些示例中,bfg 是 java -jar bfg.jar 的别名。

    # Delete all files named 'id_rsa' or 'id_dsa' :
    bfg --delete-files id_{dsa,rsa}  my-repo.git
    

    【讨论】:

    • 是第三方清洁剂吗?
    • 使用安全吗?
    • 确实,一个非常“古老”的工具,社区已经使用了几年。源代码位于 GitHub 中,因此您和社区可以浏览它。
    • 我刚刚发现 GitHub 不会删除已删除的提交,以防用户要求他们运行垃圾收集器 (stackoverflow.com/questions/34582480/remove-commit-for-good/…)。我只是迷失了,当我们使用像 GitHub 这样的第三方工具时,无论提交什么,我们总是需要要求他们删除它,这并不酷
    猜你喜欢
    • 2014-06-19
    • 2020-03-20
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2019-03-17
    相关资源
    最近更新 更多