10

我有一个 git 存储库.gitattributes

my_script.py export-subst
Makefile export-ignore
README.md export-ignore
.gitattributes export-ignore
.gitignore export-ignore
hooks/ export-ignore
tests/ export-ignore
*.pyc export-ignore

但是当我制作时:

git archive HEAD | tar -x -C ../archive_dir

archive_dir目录中,我得到目录hookstests

 ls ../archive_dir/
 hooks/  my_script.py tests/

为什么?

我的 git 版本是 1.7.9。

4

2 回答 2

12

我删除了/目录中的,这解决了问题

my_script.py export-subst
Makefile export-ignore
README.md export-ignore
.gitattributes export-ignore
.gitignore export-ignore
hooks export-ignore
tests export-ignore
*.pyc export-ignore

我在一个类似问题的答案中找到了解决方案:git ignoring .gitattributes pattern

于 2014-02-17T15:12:51.593 回答
2

自 Git 2.2+(2014 年 11 月)以来可能的另一种方法是过滤要包含在存档中的路径。

请参阅Nguyễn Thái Ngọc Duy ( )提交 ed22b41pclouds

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()它自己,但不会使用它。

于 2014-12-02T13:01:33.597 回答