3

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这是一个很好的工具。您可以仅归档子目录并使用.gitattributes文件export-ignore排除我想要的目录和文件。

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

我还注意到您可能需要添加参数--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我现在注意到当我将文件放入根目录时它似乎可以工作,但提到相对于src目录的文件路径。即这样做(也通过文件排除测试):

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

…不知何故使它与src归档命令一起工作。现在,它不再适用于归档整个目录(但这没关系)。但是,如果我把这个文件放在其他任何地方(比如在src目录中),它又不起作用了……</p>

由于我的目标是.gitattributes在子目录中包含文件以排除这些目录中的特定内容,因此这仍然无法按预期工作。

4

0 回答 0