动态 .gitignore 配置一遍又一遍地遵循相同的模式

Dynamic .gitignore configs to follow the same pattern over and over

git 这里

我的项目结构如下所示:

app/
    README.md
    .gitignore
    src/
        <all source code goes here>
    docs/
        <docs go here>
    misc/
        examples/
            <examples go here>
        fizzbuzz/
            properties/
            configs/

misc/fizzbuzz/properties/目录很特别,希望能给它设置一些特殊的.gitignore配置。在这个目录中我会有很多子目录,像这样:

app/
    README.md
    .gitignore
    src/
        <all source code goes here>
    docs/
        <docs go here>
    misc/
        examples/
            <examples go here>
        fizzbuzz/
            properties/
                abc/
                def/
                ghi/
                ...etc.
            configs/

这些子目录中的每一个(properties/)都将遵循相同的模式:

abc/
    abc.properties
    abc.txt
    many many other files...
def/
    def.properties
    def.txt
    many many other files...
ghi/
    ghi.properties
    ghi.txt
    many many other files...

所以在每个子目录中会有:

  1. 一个属性文件,其名称与其所属的子目录的名称完全相同(ghi.propertiesproperties/ghi/ 下,等等);和
  2. 一个 txt 文件,其名称也与其所属的子目录的名称完全相同(ghi.txtproperties/ghi/ 下,等等);和
  3. 很多很多其他文件。有些是 ghi.*(一个“ghi”文件,不是属性或 txt 类型)。有些将是 *.properties*.txt(其他属性文件或 txt 文件,而不是 ghi.propertiesghi.txt 等)。有些会到处命名(foobar.mp4flam.csv 等)。但这些文件的共同点是它们的格式不是“<parent-dir-name>.properties”或“<parent-dir-name>.txt”。

我正在尝试配置 .gitignore 以忽略这些子目录中的所有内容,除了与它们所在目录的名称匹配的属性和 txt 文件。

任何人都可以帮助我朝着正确的方向前进吗?

手工编写一个简单的 .gitignore 文件看起来很简单:

abc
!abc/abc.properties
!abc/abc.txt
def
!def/def.properties
!def/def.txt
# ...etc.

生成此类 .gitignore 文件的简短 Bash shell 脚本可能如下所示,但带有 basename 的可读性更高的版本可能会更清晰:

cd app/...../properties
for i in */; do printf "%s\n" "${i%/}" '!'"$i${i%/}."{properties,txt}; done > .gitignore

这样的脚本可以添加到 git-commit 挂钩或生成文件夹的自动化中。