gitignore 除了重复的子目录之外的所有内容

gitignore everything except repeated sub-directory

我的目录结构如下:

./
├── proj-1
│   ├── README.md
│   ├── src/
│   └── test/
└── proj-2
    ├── README.md
    ├── src/
    └── test/

如何只使用根目录中的一个 .gitignore 文件来忽略除 src/ 目录之外的所有内容?

我试过:

*
!.gitignore
!/*/src/
!/*/src/*

但这似乎并没有在 运行 git status.

之后获取我想要的目录

有什么建议吗?

您必须递归地取消忽略 src 目录树的所有父目录,然后忽略它们的内容:

# Ignore everything
*

# Unignore .gitignore
!.gitignore

# Unignore all directories
!*/

# Ignore contents of all directories
*/*

# Unignore all src subdirectories
!*/src/

# Unignore directory tree under src subdirectories
!*/src/**

所以,对于看起来像

的树
.
├── proj-1
│   ├── README.md
│   ├── src
│   │   ├── srcfile1
│   │   ├── srcfile2
│   │   ├── srcfile3
│   │   └── subsrc
│   │       ├── subsrcfile1
│   │       ├── subsrcfile2
│   │       └── subsrcfile3
│   └── test
│       ├── testfile1
│       ├── testfile2
│       └── testfile3
├── proj-2
│   ├── README.md
│   ├── src
│   │   ├── srcfile1
│   │   ├── srcfile2
│   │   └── srcfile3
│   └── test
│       ├── testfile1
│       ├── testfile2
│       └── testfile3
└── proj-3
    └── file

您获得此状态

On branch master

No commits yet

Untracked files:
  (use "git add <file>..." to include in what will be committed)

    .gitignore
    proj-1/
    proj-2/

nothing added to commit but untracked files present (use "git add" to track)

添加所有内容后,您会得到

$ git add * .gitignore 

$ git status
On branch master

No commits yet

Changes to be committed:
  (use "git rm --cached <file>..." to unstage)

        new file:   .gitignore
        new file:   proj-1/src/srcfile1
        new file:   proj-1/src/srcfile2
        new file:   proj-1/src/srcfile3
        new file:   proj-1/src/subsrc/subsrcfile1
        new file:   proj-1/src/subsrc/subsrcfile2
        new file:   proj-1/src/subsrc/subsrcfile3
        new file:   proj-2/src/srcfile1
        new file:   proj-2/src/srcfile2
        new file:   proj-2/src/srcfile3

.gitignore 必须明确添加,因为 shell 不会扩展 * 以包含隐藏文件。