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
文件,以排除这些目录中的特定内容,因此仍然无法正常工作。