自 Git 2.2+(2014 年 11 月)以来可能的另一种方法是过滤要包含在存档中的路径。
请参阅Nguyễn Thái Ngọc Duy ( )的提交 ed22b41:pclouds
archive
: 支持使用 glob 过滤路径
这个补丁修复了使用 : 的两个问题(glob)
(或者甚至*.c
没有“”的“ :(glob)
”)。
第一个是我们忘记在struct pathspec
. 没有它,tree_entry_interesting()
将不会将潜在目录标记为“有趣”,以便它可以确认这些目录是否具有与路径规范匹配的任何内容。
标记有趣的目录有一个副作用,我们需要走进一个目录才能意识到那里没有任何感兴趣的东西。到那时,“ archive
”代码已经将(空)目录写下来了。
这意味着结果存档中有很多空目录。
当我们知道确实需要目录时,通过懒惰地写下目录来解决这个问题。这个实现中存在一个理论上的错误:我们不能编写与该路径规范匹配的空树/目录。
path_exists()
为了检测不匹配的路径规范也变得更严格,因为当这个“递归”标志打开时,我们很可能匹配一些目录。最简单的方法是不考虑任何“匹配”的目录。
例子:
git archive -v HEAD -- ":(glob)**/sh"
git archive -o docs.zip v2.2.0 'Documentation/*.html'
注意(7 年后),相同的命令正在使用 Git 2.32(2021 年第二季度)进行重构,参见提交 4795748、提交 6c9fc42、提交 7367d88、提交 9614ad3、提交 fcc7c12、提交 eefadd1、提交 8de7821、提交 dcc0a86(2021 年 3 月 20 日)Ævar Arnfjörð Bjarmason ( avar
)。
(由Junio C Hamano 合并 -- gitster
--在提交 ad16f74中,2021 年 3 月 30 日)
例如,引用上面提到的提交:
archive
:停止通过“舞台”read_tree_recursive()
签字人:Ævar Arnfjörð Bjarmason
在存档代码中传递的“ stage
”变量只是硬编码值“0”的一种精心设计的方法。
此代码以原始形式添加到e4fbbfe(“Add git-zip-tree
”,2006-08-26,Git v1.4.3-rc1 -- merge)中,此时硬编码的“0”将传递read_tree_recursive()
到write_zip_entry()
.
然后它被认真地添加到ed22b41struct directory
中的“ ”中(“ :支持使用 glob 过滤路径”,2014-09-21,Git v2.2.0-rc0 -- merge),但我们仍然没有做任何事情,除了将它传递为-是。archive
让我们停止在 to 内部的代码中这样做archive.c
,我们仍然会将“0”提供给read_tree_recursive()
它自己,但不会使用它。