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

如何从git repo中删除不存在的文件?,git,Git,我滥用GIT在本地使用它作为增量备份解决方案。一部分是为了教我git,但另一部分是为了打击JPG和MP3文件的腐败,这种腐败是千载难逢的 很明显,回购协议的规模越来越大。我需要从历史记录中清除不存在的文件。(我有很多安全视频会自动进入系统,但稍后也会被删除,而且我不需要在我的.git文件夹中完全签入前院的视频源。) 这是一个以“正确”的方式滥用工具的问题——我不介意为我拥有的文件浪费大量空间;如果一个文件存在,我不介意它有100个版本。但如果它不存在,我希望它退出回购协议,永远无法收回;完全从历

我滥用GIT在本地使用它作为增量备份解决方案。一部分是为了教我git,但另一部分是为了打击JPG和MP3文件的腐败,这种腐败是千载难逢的

很明显,回购协议的规模越来越大。我需要从历史记录中清除不存在的文件。(我有很多安全视频会自动进入系统,但稍后也会被删除,而且我不需要在我的.git文件夹中完全签入前院的视频源。)


这是一个以“正确”的方式滥用工具的问题——我不介意为我拥有的文件浪费大量空间;如果一个文件存在,我不介意它有100个版本。但如果它不存在,我希望它退出回购协议,永远无法收回;完全从历史中删除。

有两个解决此问题的好工具。可以从历史记录中删除大文件,又名git lfs,允许您将大型文件放在git中,而不会增加存储库的大小


将它们放在一起,您可以使用新的
——convert to git lfs
选项。然后使用git-lfs将来提交大文件。

使用
ls树头
在您的

然后用
删除不存在的文件

它是完成这类任务的最佳工具

BFG回购清洁剂 git过滤器分支的替代方法

BFG是git filter分支的一种更简单、更快的替代方法,用于清除git存储库历史记录中的不良数据:

  • 删除疯狂的大文件
  • 删除密码、凭据和其他私有数据
示例(来自官方网站) 在所有这些示例中,bfg是java-jar bfg.jar的别名


清理存储库后,请使用存储库来存储大型文件


这确实是对该工具相当严重的滥用。最好弄清楚是什么损坏了原始文件。Git在这里真正提供给您的是内容校验和,您可以在Git之外进行校验和。。。或者在Git内部,通过使用一个数据结构而不是通常的提交链,使用不太严重的滥用

换句话说,如果你想学习如何以错误的方式使用Git,我认为有一种“更好的错误方式”。以下是我的建议:

  • 在新的孤立分支上进行每个提交。您可以使用
    git checkout-b--orphant
    或使用“管道”工具
    git write tree
    git commit tree
    来实现这一点

  • 每个分支只包含一个提交。(如果使用的是卫浴工具,则可以使用标记而不是支管。)

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

以图表形式,而不是:

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

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

o--o--o--o--o--o要完全删除文件,您必须重写存储库的历史记录,就像您没有添加它一样。(特别是第二个答案)。我以前已经看过了,但这些都是针对“我有一个文件要从回购历史中删除,我知道它的文件名”这种情况的解决方案。在我的例子中,它不止一个文件,我不知道它的文件名。因为名称列表实际上是“自上次提交以来删除的文件集”。很难获得当前不存在的文件列表!;)嗯,它不仅仅是校验和-它让我恢复以前的版本。我已经故意损坏了文件,并将其恢复到以前的版本,以证明它符合我的标准。我只是不希望回购协议有那么大。这并不是说我没有50TB的空间,但我不想浪费它。我真的很喜欢这个想法,但我认为如果故意修改文件,它就会失败。(也就是说,有一堆孤立分支包含该文件的副本,但没有该文件的历史记录,因为使用此方法会丢失父沿袭)。替代结构是每个文件的一个分支,每次文件更改时都会附加该分支,当文件被删除时(通过删除同名分支)该分支会被完全丢弃。@Dave:这是一个不错的替代方法。直接使用它更痛苦(我认为,您可能需要某种“签入”和“签出”步骤的包装脚本),并且可能需要更复杂的分支管理,例如,一个伪分支(单次提交),它维护一个文件是“文件”的列表(您真正需要的只是一个分支名称,但也许一个可以创建树并指向它的秘密方法也可以工作)。在我的例子中,我没有“要从历史记录中删除的特定文件”,而是“如果磁盘上不存在历史记录中的所有文件,请将其删除”。[打算在睡觉前单击“提交”;我在睡觉时看到一些新的注释弹出]。无论如何,这个解决方案的实现似乎太难了,因为我觉得它应该只是一个git命令,出于某种原因,git作者没有想到添加它;)如果我在这里得到了错误的印象,请原谅,但是BFG Repo Cleaner似乎是为从存储库中删除符合“大”定义的文件而设置的。但这不是我想做的。即使一个文件是400兆,如果它存在于我的硬盘上,我也希望将它保存在repo中。但是如果我删除了它,我希望从repo中删除它的所有历史痕迹。@ClintL我建议你不要删除它们。而是使用BFG+git lfs将大文件转换为git lfs。然后你可以保留它们的历史记录历史记录并有一个精简的repo。否则,如果你得到一个不再在头上的文件列表,BFG可以做你想做的事情。明白了。我是新来的。但实际上我根本不想让不再存在的文件有历史记录。(在我的情况下,他们已经转移到一个新的完全独立的repo,并将在那里被跟踪;这就是事实。)对于那些这样做的人,我不介意巨额回购,我也不介意对200G音乐收藏进行TB级回购
o--o--o--...--o--o   <-- master

              ^  ^
              |   \
              |  the most recent
              |
         an hour ago, or yesterday, or whatever
o   <-- backup-20160508T101112.13

o   <-- backup-20160508T131415.16

...