如何永久删除存储在GIT中的文件?

时间:2010-01-05 03:36:27

标签: git

我将我的数据库备份到GIT,这样我就可以在家用电脑上获取数据库了。

我不希望这个文件被版本化,它只是一次性的事情。

我可以将其删除,因此GIT无法跟踪它的进展情况吗?

5 个答案:

答案 0 :(得分:83)

我总觉得Guides: Completely remove a file from all revisions feed很有帮助。

  

删除名为Rakefile的文件:

git filter-branch --force --index-filter \
  'git rm --cached --ignore-unmatch Rakefile' \
  --prune-empty --tag-name-filter cat -- --all
     

此命令将运行每个分支和标记的整个历史记录,从而更改任何提交   涉及文件Rakefile以及之后的任何提交。提交   之后是空的(因为它们只改变了Rakefile)   完全删除。

答案 1 :(得分:24)

remote repository的更新:

git filter-branch -f --index-filter "git rm -rf --cached --ignore-unmatch FOLDERNAME" -- --all

将FOLDERNAME替换为您要从给定git存储库中删除的文件或文件夹。

rm -rf .git/refs/original/

git reflog expire --expire=now --all

git gc --prune=now

git gc --aggressive --prune=now

现在将所有更改推送到远程存储库

git push --all --force

这会清理远程存储库。

答案 2 :(得分:3)

您也可以轻松使用bfg。

  

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

删除疯狂的大文件 删除密码,凭证和密码其他私人数据

$ bfg --delete-files YOUR-FILE-WITH-SENSITIVE-DATA

或者只是替换某些文件的所有匹配项:

$ bfg --replace-text passwords.txt

检查https://rtyley.github.io/bfg-repo-cleaner/https://help.github.com/articles/removing-sensitive-data-from-a-repository/

答案 3 :(得分:1)

您可以使用git filter-branch--index-filter

答案 4 :(得分:0)

我想分享最适合我的最简单易懂的解决方案。

首先使用--mirror标志克隆存储库的新副本:

git clone --mirror https://github.com/username/youproject.git

然后从https://rtyley.github.io/bfg-repo-cleaner/下载最新版本的BFG jar文件,将其重命名为bfg.jar并将其粘贴到YourRepoName.git文件夹中。

然后在git bash中运行以下行。

java -jar bfg.jar --delete-files yourfilename(仅需要文件名,无需提及路径)

git reflog expire --expire=now --all && git gc --prune=now --aggressive(它将删除由于上述命令而被驱逐出的不需要的脏数据)

我在这里遇到了问题。我的项目有公开拉取请求。如果有任何打开的拉取请求,则需要运行此命令

git show-ref | cut -d' ' -f2 | grep 'pull-request' | xargs -r -L1 git update-ref -d

此后,您可以简单地推送master分支。

git push -u origin master

完成了。但是请记住在执行上述操作之前,将副本保留在旧存储库的本地中。所有未合并的分支和打开的请求都可能会被删除。

我通过删除不需要提交的apk文件将我的repo大小从40mb减小到4mb。