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
在子目录中包含文件以排除这些目录中的特定内容,因此这仍然无法按预期工作。