前一段时间我添加的信息(文件)必须是私有的。从项目中删除不是问题,但我还需要从git历史中删除它。
我使用Git和Github(私人账号)。
注意:在这个线程中显示了一些类似的东西,但这里是一个添加到特性分支的旧文件,该分支合并到开发分支,最后合并到master,因此,做了很多更改。所以这是不一样的,需要的是改变历史,并隐藏这些文件的隐私。
前一段时间我添加的信息(文件)必须是私有的。从项目中删除不是问题,但我还需要从git历史中删除它。
我使用Git和Github(私人账号)。
注意:在这个线程中显示了一些类似的东西,但这里是一个添加到特性分支的旧文件,该分支合并到开发分支,最后合并到master,因此,做了很多更改。所以这是不一样的,需要的是改变历史,并隐藏这些文件的隐私。
当前回答
首先,将它添加到你的.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 -filter-branch的替代方案,用于清除Git存储库历史中的坏数据:
***删除疯狂的大文件*** 删除密码,凭证和其他私人数据
例子(来自官方网站)
在所有这些例子中,bfg是java -jar的别名。
# Delete all files named 'id_rsa' or 'id_dsa' :
bfg --delete-files id_{dsa,rsa} my-repo.git
其他回答
如果您最近提交了该文件,或者该文件在一次或两次提交中发生了更改,那么我建议您使用rebase和cherrypick来删除该特定的提交。
否则,你就得重写整个历史。
git filter-branch --tree-filter 'rm -f <path_to_file>' HEAD
当您对更改感到满意并适当地确保一切正常时,您需要更新所有远程分支-
git push origin --force --all
注意:-这是一个复杂的操作,你必须知道你在做什么。首先尝试在演示存储库中执行它,看看它是如何工作的。您还需要让其他开发人员了解它,这样他们就不会同时做出任何更改。
我找到了这个答案,它很有用:
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
删除文件并重写提交历史(这将从你提交的文件中创建新的提交哈希):
有两种方法:
使用git-filter-branch:
Git filter-branch——force——index-filter ' Git rm——cached——ignore-unmatch <path to file or directory>'——prune-empty——tag-name-filter cat -- --all
使用git-filter-repo:
pip3 install git-filter-repo
git filter-repo --path <path to the file or directory> --invert-paths
现在强制推repo: git推origin -force -all,并告诉你的合作者rebase。
使用bfg repo-cleaner包是git-filter-branch的另一个可行的替代方案。显然,它也更快……
我读了这篇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