如何从git仓库中删除不存在的文件?

时间:2016-05-08 23:29:43

标签: git

我在滥用GIT在本地使用它作为增量备份解决方案。在某种程度上教我git,但部分是为了打击JPG和MP3文件损坏,这在一个蓝色的月亮中发生过一次。

显然,回购变得非常庞大。我需要清除历史记录中不存在的文件。 (我有很多安全视频会自动进入系统,但也会在以后删除,我不需要在我的.git文件夹中完全检查我前院的视频。)

这是以“正确”方式滥用工具的问题 - 我不介意为我拥有的文件浪费大量空间;我不介意有100个版本的文件,如果它是一个存在的文件。但如果它不存在,我想把它从回购中拿出来,没有办法把它带回来;完全从历史中抹去。

3 个答案:

答案 0 :(得分:1)

这个问题有两个很好的工具。 BFG Repo Cleaner可以从历史记录中删除大文件。 Git Large File Storage,又名git-lfs,允许您将大文件放在Git中,而不会使您的存储库大小膨胀。

将它们组合在一起,您可以使用新的--convert-to-git-lfs选项use BFG to change old commits of large files to use gif-lfs。然后使用git-lfs进行大型文件的未来提交。

答案 1 :(得分:1)

使用ls-tree HEAD获取

中的文件

然后删除不存在的文件 https://github.com/rtyley/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

enter image description here

清理存储库后,使用this tool存储大文件。

enter image description here

答案 2 :(得分:1)

这确实是相当严重的滥用工具。找出破坏原始文件的内容可能会更好。所有Git将真正给你的是内容校验和,你可以在Git之外做...或者在Git里面,通过使用除了通常的提交链之外的数据结构来减少滥用。

换句话说,如果你想这样做是为了学习如何以错误的方式使用Git :-)我认为有一个更好的错误方式"。这是我的建议:

  • 在新的孤立分支上进行每次提交。您可以使用git checkout -b --orphan或使用" plumbing"工具git write-treegit commit-tree

  • 每个分支都包含一个且只有一个提交。 (如果您使用的是管道工具,则可以使用标签而不是分支。)

  • 然后,要删除备份(整个),只需删除分支(或标记)名称。

按照图示,而不是:

o--o--o--...--o--o   <-- master

              ^  ^
              |   \
              |  the most recent
              |
         an hour ago, or yesterday, or whatever

您的提交将是:

o   <-- backup-20160508T101112.13

o   <-- backup-20160508T131415.16

...

这些名称或多或少是ISO日期格式,YYYYMMDDTHHMM.SS;但你可以使用任何对你最有意义的名字。

请注意,如果两个备份提交相同的文件,它们会重用所有底层Git&#34; blob&#34;对象,因此两个备份与一个备份占用的空间基本相同。删除这两个备份中的一个(通过删除分支或标记名称)无效,因为所有这些文件都由另一个备份引用。

如果一个文件(xyz.txt)略有不同,Git将以Git的常规方式对另一个文件(在任何其他提交中)进行delta压缩:提交不需要父级/孩子的关系。请注意,无论如何,图像和电影文件在Git中很少压缩(因为它们已经压缩了:信息理论说如果第一次压缩是好的,第二次尝试就无济于事了。)

现在让我们假设您不再需要备份文件foo.jpg。只需删除它:一旦最旧的备份来自&#34;现在&#34;它将过期并被垃圾收集。确实,删除的文件将保留在较旧的备份中,但仅限于保留这些备份的时间。