Git存档:导出忽略,忽略目录。

13

我有一个带有以下.gitattributes文件的Git仓库:

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。


@twalberg git 版本:1.7.9 - JuanPablo
@twalberg,git export-ignore其他文件,只有目录存在问题。 - JuanPablo
2个回答

16

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

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


4
请注意,您要排除树下所有的 hooks 文件夹。如果只想要排除根目录下的 hooks 文件夹,请在其前面加上斜杠:/hooks - tivnet

2
另一种方法是在Git 2.2+(2014年11月)之后可能的,即过滤您想要包含在归档中的路径。
请参见提交ed22b41,作者为Nguyễn Thái Ngọc Duy (pclouds)

archive:支持使用glob筛选路径

此补丁修复了使用:(glob)(甚至不带“:(glob)”的“*.c”)的两个问题。

第一个问题是我们忘记在struct pathspec中开启'recursive'标志。 没有这样做,tree_entry_interesting()将不会标记潜在目录为“interesting”,以便它可以确认这些目录是否有与pathspec匹配的内容。

将文本翻译成中文:
标记目录有趣会产生一个副作用,我们需要进入目录才能意识到里面没有任何有趣的东西。这时,“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() 传递“stage”

签名:Ævar Arnfjörð Bjarmason

在归档代码中传递的“stage”变量只是一种精心设计的方式,用于硬编码值“0”。
这段代码最初是在e4fbbfe(“添加git-zip-tree”,2006-08-26,Git v1.4.3-rc1 -- 合并)中以其原始形式添加的,在此时一个硬编码的“0”将通过read_tree_recursive()传递到write_zip_entry()
然后,它被勤奋地添加到ed22b41(“archive:支持使用glob过滤路径”,2014-09-21,Git v2.2.0-rc0 -- 合并)中的“struct directory”中,但我们仍然没有做任何事情,除了按原样传递它。
让我们停止在archive.c内部的代码中这样做,我们仍然会将“0”提供给read_tree_recursive()本身,但不会使用它。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接