不久前,我添加了必须保密的信息(文件)。从项目中删除它不是问题,但我还需要从 git
历史中删除它。
我使用 Git 和 Github(私有账户)。
注意:在这个讨论串中展示了类似的内容,但那里是一个旧文件被添加到一个特性分支,该分支合并到开发分支,最后合并到主分支,因此进行了很多更改。所以这不是同一种情况,需要做的是改变历史记录,并且为了保护隐私而隐藏那些文件。
我找到了这个答案,它很有帮助:
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
.env
的新分支确实有效。解决方法简单明了。 - Joe Scotto<previous_hash>..HEAD
可以节省一些时间。 - Victor Sergienkogit push --force
命令。 - Sebastianfilter-branch
命令有如下警告:“警告:git-filter-branch存在许多问题,可能会导致历史记录重写,建议在执行之前按Ctrl-C中止操作,然后使用其他过滤工具,例如'git filter-repo' (https://github.com/newren/git-filter-repo/)。有关详细信息,请参阅filter-branch手册页。要消除此警告,请设置FILTER_BRANCH_SQUELCH_WARNING=1。” - Ryan Lundygit
建议在执行git filter-branch
命令时使用第三方附加组件git-filter-repo。有一个很长的理由清单,说明为什么git-filter-repo
比其他任何替代品更好,我的经验是它非常简单和非常快速。
此命令会从所有分支的所有提交中删除文件。
git filter-repo --invert-paths --path <path to the file or directory>
--path
参数来指定多个路径。您可以在此处找到详细的文档:
https://www.mankier.com/1/git-filter-repo
.git
,所以我想为什么不手动删除.git
并重新初始化呢? - chovypip install git-filter-repo
。 - Kaushal Modirebase
和cherrypick
来删除该特定的提交。git filter-branch --tree-filter 'rm -f <path_to_file>' HEAD
当您对更改感到满意并已经确保一切看起来都很好时,您需要更新所有远程分支 -
git push origin --force --all
注意:这是一个复杂的操作,你必须知道自己在做什么。首先,尝试在演示存储库上执行此操作,以了解其工作原理。同时,您还需要让其他开发人员知道此操作,以便他们在此期间不会做出任何更改。
--tree-filter
而不是像 @PetroFranko 的回答中那样使用 --index-filter
? - einpoklumWARNING: git-filter-branch has a glut of gotchas generating mangled history rewrites. Hit Ctrl-C before proceeding to abort, then use an alternative filtering tool such as 'git filter-repo' (https://github.com/newren/git-filter-repo/) instead. See the filter-branch manual page for more details; to squelch this warning, set FILTER_BRANCH_SQUELCH_WARNING=1.
- Jake从你提交的文件中删除文件并重写历史记录(这将从你提交的文件创建新的提交哈希):
有两种方法:
git filter-branch --force --index-filter 'git rm --cached --ignore-unmatch <path to the file or directory>' --prune-empty --tag-name-filter cat -- --all
pip3 install git-filter-repo
git filter-repo --path <path to the file or directory> --invert-paths
git push origin --force --all
,并告诉你的合作者进行rebase
操作。git filter-repo
:我收到了以下信息:中止: 拒绝破坏性地覆盖版本库历史记录,因为这看起来不像是一个新克隆。 (预期是新打包的版本库) 请改用新克隆。如果您想继续,请使用—force。
如果我强制执行,我会得到以下信息:致命: 'origin' 不似乎是 git 版本库, 无法从远程存储库读取
。 - alpergit filter-branch
对我很有用! - Federico Peraltagit filter-branch
ж–№жі•пјҢиҖҢfilter-repo
ж–№жі•еҲҷеҲ йҷӨдәҶиҝңзЁӢжәҗгҖӮ - Ilya Sheershoff我阅读了这篇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
-r
选项。 - Meir Gabay首先,将其添加到您的.gitignore
文件中,并不要忘记提交该文件 :-)
您可以使用此网站:http://gitignore.io 为您生成.gitignore
并将所需路径添加到您的二进制文件/文件夹中
一旦将文件添加到.gitignore
中,您可以使用BFG删除“旧”的二进制文件。
如何从代码库中删除大文件
您可以使用 git filter-branch
或 BFG。
https://rtyley.github.io/bfg-repo-cleaner/
BFG Repo-Cleaner
是 git-filter-branch 的替代品。
BFG 是一个更简单、更快速的替代方案,用于从 Git 仓库历史记录中清理坏数据:
*** 删除超大文件 ***
- 删除密码、凭据和其他私人数据
在所有这些示例中,bfg 是 java -jar bfg.jar 的别名。
# Delete all files named 'id_rsa' or 'id_dsa' :
bfg --delete-files id_{dsa,rsa} my-repo.git
git filter-branch --index-filter "git rm --cached --ignore-unmatch ProjectFolderName/src/main/resources/application-prod.properties" HEAD
git push origin --force --all
git update-ref -d refs/original/refs/heads/master
git filter-branch --index-filter "git rm --cached --ignore-unmatch ProjectFolderName/src/main/resources/application.properties" HEAD
git push origin --force --all
git update-ref -d refs/original/refs/heads/master
bfg --delete-files YOUR-FILE-WITH-SENSITIVE-DATA
在您的存储库历史记录中,无论在哪里找到,请替换密码.txt中列出的所有文本,并运行:
bfg --replace-text passwords.txt
git push --force
此外,由于该技术会重写您的存储库历史记录,改变现有提交的SHAs,因此您应该修改任何依赖的提交。所以,请合并并关闭所有未完成的PR!
git rebase
命令,然后用git push -f
命令推送代码。 - Cory Kramerfilter-branch
方法可以实现您想要的功能。 - 1615903git filter-branch
更快。该链接在https://dev59.com/fXI95IYBdhLWcg3w5iU4#17890278/上。 - Hasturkun