如何从Git历史记录中删除文件?

Mar*_*ara 31 git github

我之前添加的信息必须是私有的,从项目中删除,不是问题,但也必须从历史中删除.

我使用Git和Github(私人账户).


这个线程上显示类似的东西,但这里是一个旧文件,添加到一个功能分支,该分支合并到一个开发分支,最后合并到master,因为这样做了很多更改.所以它不一样,所需要的是更改历史记录,并隐藏该文件以保护隐私.

Tib*_*ács 25

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 <path to the file or directory> --invert-paths

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

  • 我收到错误:git:'filter-repo' 不是 git 命令。请参阅“git --help”。 (7认同)
  • @cikatomo 另一种安装 `pip install git-filter-repo` 的方法。 (7认同)
  • 这有效,但它删除了“.git”,所以我想知道为什么不手动删除“.git”并重新初始化? (4认同)
  • 这应该设置为新的最佳答案,因为它是最新的。 (4认同)
  • @cikatomo这是一个第三方工具,你必须安装它https://github.com/newren/git-filter-repo/blob/main/INSTALL.md (3认同)
  • **使用此工具时要非常小心**。我几乎失去了很多工作。阅读文档并考虑将所有文件备份到目录外部的 zip 文件中,然后再继续。该工具的缺点是没有给您足够的警告。这在很大程度上是 RTFM 的情况。 (2认同)

hsp*_*her 24

如果您最近提交了该文件,或者该文件在一次或两次提交中已更改,那么我建议您使用rebasecherrypick删除该特定提交.

否则,您必须重写整个历史记录.

git filter-branch --tree-filter 'rm -f <path_to_file>' HEAD
Run Code Online (Sandbox Code Playgroud)

当您对这些变化感到满意并且确保一切看起来都很好时,您需要更新所有远程分支 -

git push origin --force --all
Run Code Online (Sandbox Code Playgroud)

注意: - 这是一个复杂的操作,你必须知道你在做什么.首先尝试在演示存储库中执行它以查看它是如何工作的.您还需要让其他开发人员了解它,以便它们不会在平均时间内进行任何更改.

  • 为什么你的建议使用 `--tree-filter` 而不是像 @PetroFranko 的答案中那样使用 `--index-filter` ? (3认同)
  • 天哪,它成功了!我的意思是这真的非常简单。我以前也曾用过困难的方法,但这次要容易得多。提示:路径必须是相对的。 (3认同)

小智 24

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

git filter-branch --index-filter "git rm -rf --cached --ignore-unmatch path_to_file" HEAD
Run Code Online (Sandbox Code Playgroud)

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

  • 当前版本的 Git 对于 `filter-branch` 是这么说的:“警告:git-filter-branch 有大量陷阱,会产生损坏的历史重写。在继续中止之前按 Ctrl-C,然后使用替代过滤工具,例如“git” filter-repo' (https://github.com/newren/git-filter-repo/) 代替。有关更多详细信息,请参阅 filter-branch 手册页;要消除此警告,请设置 FILTER_BRANCH_SQUELCH_WARNING=1。” (30认同)
  • 在此之后,它只对我有效`git push --force` (7认同)
  • 赞同 @sudo 所说的,但这确实适用于我不小心将 `.env` 提交到的新分支。快速且切题的解决方案。 (5认同)
  • 警告:这会产生大量的提交并导致分歧。您可能必须强行推后,但我太害怕了。 (2认同)
  • 事实上,简单的用力推动就可以了!我也很害怕,但还是支持一切。 (2认同)
  • 您还可以指定提交范围作为最后一个参数。如果有问题的提交是最近的,请执行“&lt;previous_hash&gt;..HEAD”并节省一些时间。 (2认同)
  • 不起作用,我所做的提交现在已在修订历史记录中......尝试了很多方法...... (2认同)
  • 这并没有从我的存储库中删除该文件,它保持原样 (2认同)
  • @aderchox 它并不完全“添加”提交,它重写了现有的提交。这些提交被新的提交替换,具有不同的哈希值 (2认同)

suh*_*lvs 17

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

有两种方法:

1.使用过滤器分支

git filter-branch --force --index-filter 'git rm --cached --ignore-unmatch <path to the file or directory>' --prune-empty --tag-name-filter cat -- --all

2.使用过滤器回购

pip3 install git-filter-repo
git filter-repo --path <path to the file or directory> --invert-paths
Run Code Online (Sandbox Code Playgroud)

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

  • 对于“git filter-repo”:我收到以下消息:“正在中止:拒绝破坏性地覆盖存储库历史记录,因为这看起来不像一个新的克隆。” (预期是新包装的回购)请在新的克隆上进行操作。如果您仍想继续,请使用 --force。`。如果我强迫它,我会得到以下信息:`致命:'origin'似乎不是 git 存储库致命:无法从远程存储库读取。` (10认同)
  • `git filter-branch` 方法在 Mac 上对我有用,而 `filter-repo` 方法正在删除远程源 (3认同)
  • 这有效,但我忘记先备份文件,现在它消失了。:-( (2认同)

van*_*nts 14

我阅读了这篇 GitHub 文章,这使我使用了以下命令(类似于已接受的答案,但更强大):

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
Run Code Online (Sandbox Code Playgroud)

  • 它比接受的答案更好,但它也会删除语言环境中的文件。如果您不想浪费时间重写,请在此之前复制一份。 (6认同)
  • 完成所有清除后,不要忘记“git push --force”。 (2认同)

小智 8

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


Cod*_*ard 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
Run Code Online (Sandbox Code Playgroud)

在此处输入图片说明


归档时间:

查看次数:

11529 次

最近记录:

6 年 前