如何忽略“ git归档文件”中的文件/目录,仅创建子目录的归档文件?

时间:2018-10-14 15:39:24

标签: git gitattributes git-archive

TL; DR:git archive命令似乎仅存档单个子目录遵守.gitattributes,并从中排除文件/目录生成的ZIP,但不能同时使用。

假设我的git存档中有此目录结构(为简化可重用性而进行了简化):

.
├── assets
├── build
├── CONTRIBUTING.md
├── CONTRIBUTORS
├── LICENSE.md
├── README.md
├── scripts
├── src
│   ├── background
│   ├── common
│   ├── icons
│   ├── _locales
│   ├── manifest.json
│   ├── options
│   ├── popup
│   └── tests
└── tests -> src/tests

现在,我想获取一个具有以下内容的 ZIP(或tar)存档

    src目录的
  • 内容,因为这是我要存档的源代码。但是,本身没有直接src
  • 在这些目录中,我可能想忽略更多文件夹和文件。例如。 tests显然需要被忽略。

最后,档案应例如看起来像这样:

.
├── background
├── common
├── icons
├── _locales
├── manifest.json
├── options
└── popup

现在,我认为git archive是一个很好的工具。您可以archive a subdirectory only并将export-ignore.gitattributes files一起使用,以排除我想要的目录和文件。

目标是还可以在多个子文件夹中递归使用.gitattributes,因此我也可以始终在不知道上层文件夹结构的情况下从存档中排除单个文件。 (例如,对于包含的库很有用)

我还注意到您may need to add the parameter --worktree-attributes,所以git在任何地方找到它的.gitattributes文件。而且我使用**来排除子目录。很好。

所以(在这里进行测试),我尝试过:

$ git archive --worktree-attributes --format=tar HEAD:src | tar t

因此,仅存档子目录不会有任何问题,但排除文件则不会。

例如我将此.gitattributes放入了src目录中:

tests export-ignore
tests/** export-ignore

现在,运行上述命令,它仍然包含tests目录内容。 但是,如果我运行git archive --worktree-attributes --format=tar HEAD | tar t,即不存档子目录,则列表以以下结尾:

src/popup/[…]
tests

这意味着它排除了tests目录的内容。由于某种原因,它没有排除目录本身,但这可能是我这方面的另一个问题。

相反,如果我将以下文件放入根目录,则整个src/tests目录将被排除(尽管我在语义上表示相同):

src/tests export-ignore
src/tests/** export-ignore

我的git版本:2.17.2
Fedora 28

编辑:我现在注意到,当我将.gitattributes文件放入 root dir 时,它似乎可以工作,但是提到了相对于src目录。即这样做(也已通过文件排除测试):

tests export-ignore
tests/** export-ignore
manifest.json export-ignore

…以某种方式使其可以与src存档命令一起使用。现在,它不再适用于归档整个目录(但这没关系)。 但是,如果我将此文件放在其他任何地方(如src目录中),它将再次不起作用…

由于我的目标是在子目录中拥有.gitattributes文件,以排除这些目录中的特定内容,因此仍然无法正常工作。

0 个答案:

没有答案