创建归档文件
export-subst
如果为文件设置了属性export-subst
,那么Git在将该文件添加到归档时会展开几个占位符。[...]这些占位符与git-log(1)的选项--pretty=format:
的占位符相同,只是它们需要如下 Package :$Format:PLACEHOLDERS$
。例如,字符串$Format:%H$
将替换为提交哈希。但是,每个存档只扩展一个%(describe)
占位符 * 以避免拒绝服务攻击*。git log
man page表示:
漂亮的格式
[...]
format:<format-string>
[...]
占位符包括:
[...]
- 扩展到从提交中提取的信息的占位符:
[...]%(describe[:options])
人类可读名称,如git-describe(1);无法描述的提交的空字符串。描述字符串后面可以跟一个冒号和零个或多个逗号分隔的选项。同时添加或删除标记时,描述可能不一致。
如果我忘记标记最近的提交,git describe
不得不扫描数万亿个过去的提交来找到最近的标记...我可以用^C来终止git archive
。那么在这个所谓的"* denial-of-service *"中,谁的服务被拒绝了呢?
2条答案
按热度按时间ppcbkaq51#
至少GitHub使用
git archive
来生成归档文件,GitLab、cgit和其他类似的环境也可能是这样。虽然GitHub会缓存归档文件一段时间,但使用非常昂贵的操作和大量的进程是不可取的,因为这会使存储数据的文件服务器过载。GitHub确实对昂贵的操作进行了速率限制,但是如果归档非常昂贵,那么这意味着同一个仓库在归档、克隆和获取时会有更长的延迟时间,因此仓库的伸缩性会较差。(例如,由于容器限制),这也意味着类似的问题可能会影响像kernel.org这样的站点。
两到三次扩张可能不是问题,但大量扩张可能是问题,目前的限制是一次,正如torek的评论中提到的。
wfveoks02#
| 问题|解决方案|
| - ------| - ------|
| 成千上万的
%(describe)
会减慢未受保护的进程|限制每个人在每个存储库中只能使用一个%(describe)
|| 大文件上传导致设计不良的Web服务器崩溃|Web浏览器将所有文件上载限制为1kB/天/主机|
大量的
%(describe)
和大文件上载都可以在服务器端阻止(需要时),因此它们本身并不代表拒绝服务攻击。我不明白这个严厉的"解决方案"怎么会是由两个本应独立的人提出来的。因为少数用户的不良行为和/或为了商业利益而严格限制所有用户的心态开创了一个危险的先例。正如我在上文所展示的,这个问题有有效的、有针对性的技术解决方案。
真正需要学习的是,git不应该因为这个目的而膨胀代码,因为任何需要它的人都可以用
make
和sed
实现他们自己的无git解决方案。现在%(describe)
除了最有限的情况外,在所有情况下都是无用的,它真的只是代码膨胀。我建议不要使用它。