Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/git/21.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
过滤git repo以从历史记录中删除大文件。工作副本成功,但推送后未在远程回购中显示_Git - Fatal编程技术网

过滤git repo以从历史记录中删除大文件。工作副本成功,但推送后未在远程回购中显示

过滤git repo以从历史记录中删除大文件。工作副本成功,但推送后未在远程回购中显示,git,Git,我使用Gary Gauh在年的建议删除了一些错误提交给git回购的大型文件 这将repo的/git/objects目录的大小从50M减少到35M 当我git提交和git推送这个目录时,我被告知没有什么可做的。我的假设是,提交已被推送 但是,当我检查服务器repo目录上.git/objects目录的大小时,我看到objects目录仍然是50M 那么,我错过了什么 «无事可做»意味着您尝试推送的内容与远程回购中持有的状态完全匹配,因此实际上无事可做-因为您没有任何可供远程回购使用的新历史记录。 请确

我使用Gary Gauh在年的建议删除了一些错误提交给git回购的大型文件

这将repo的
/git/objects
目录的大小从50M减少到35M

当我
git提交
git推送
这个目录时,我被告知没有什么可做的。我的假设是,提交已被推送

但是,当我检查服务器repo目录上
.git/objects
目录的大小时,我看到
objects
目录仍然是50M


那么,我错过了什么

«无事可做»意味着您尝试推送的内容与远程回购中持有的状态完全匹配,因此实际上无事可做-因为您没有任何可供远程回购使用的新历史记录。 请确保在处于“分离头部”状态时未运行
git filter branch
命令,否则该命令将仅更新
头部
ref,而不接触任何本地分支


另一个值得考虑的事实是,stock Git实现使用了惰性垃圾收集,并且您确实使用同一块的更精简版本覆盖了一些相当大的历史块,这一事实对于远程回购来说通常意味着什么:默认情况下,所有“替换”的提交仍然存在,悬而未决,只有在下次修剪它们时才会删除。当满足某些()阈值(如悬空对象的数量)时,垃圾回收会自动发生


因此,如果您真的需要回收空间,那么在成功推送之后-这应该需要
git push
命令的
-force
参数,因为您将要替换一些历史记录,-您应该登录到服务器并使用拥有repo的帐户的凭据运行
git gc--force--aggressive

另一个要考虑的情况(完整性):Git RePOS支持所谓的:每一个“剧烈分支头运动”都记录在一个特殊的可到期日志中。默认情况下,reflog在“普通”存储库中启用,在“裸”存储库中禁用(这些存储库大部分时间用于托管公共共享repo),但是。如果在目标repo中启用了reflog,则替换其中的某些历史记录将使替换的提交链的tip commit放入reflog中,这将使reflog引用该历史记录,直到该记录过期。


在这种情况下,运行git
gc--force--aggressive
对回购协议的大小没有任何影响,您需要先强制reflog过期;否则,您需要等待这些引用。

“无事可做”意味着您尝试推送的内容与远程回购中持有的状态完全匹配,因此实际上无事可做-因为您没有任何可供远程回购使用的新历史记录。请确保在处于“分离头”状态时未运行
git filter branch
命令,否则该命令将只更新
HEAD
ref,而不涉及任何本地分支。另一个值得考虑的事实是,stock git实现使用惰性垃圾收集,事实上,您确实用一个更精简版本的相同数据块覆盖了一些相当大的历史数据块,这对于远程回购来说通常意味着什么:默认情况下,所有“替换”的提交仍将在那里悬空,并且只有在下一次
git gc
git repack
删除它们时才会被删除。当满足某些(可配置的)阈值(如悬空对象的数量)时,垃圾收集会自动发生。因此,如果确实需要回收空间,则在成功推送之后(当您要替换某些历史记录时,
git push
命令应该需要
--force
参数),您应该登录服务器并运行<代码> Git GC -强制-攻击/代码>拥有该回购请求的帐户的凭据。另一个要考虑的情况(完整性):Git RePOS支持所谓的“重新FLUG”:每个“急剧分支头移动”都记录在一个特殊的可到期日志中。默认情况下,reflog在“普通”存储库中启用,在“裸”存储库中禁用(大部分时间用于托管公共共享repo)。如果在目标回购中启用了reflog,则替换其中的某些历史记录将使替换的提交链的tip commit放在reflog中,这将使reflog引用该历史记录,直到该记录过期……在这种情况下,运行
git-gc--force--aggressive
不会对您需要强制首先终止reflog的回购协议的大小产生任何影响。我不确定这是否是你的情况,但我在这里发布这篇文章供下一位读者阅读。;-)
 git filter-branch --tree-filter 'rm -f *jpg' HEAD