.gitignore,如何排除文件夹中的所有文件,同时保留那些包含 .gitkeep 文件的子文件夹?

5
我想要忽略log文件夹中的所有文件,但需要保留.gitkeep文件(用于保留空目录)。
- log
  |- foo.log (should be ignored)
  |- folder1 (should be ignored)
  |- folder2 (keep it because contains a .gitkeep file)
     |- .gitkeep

无法工作:

/log/*
!/log/*/.gitkeep

使用 ** 也不起作用:

/log/*
!/log/**/.gitkeep

这是否可能实现...而不需要手动排除每个子文件夹,就像这样?

/log/folder1/*
/log/folder2/*
!/log/folder2/.gitkeep
2个回答

6

取消忽略由 * 忽略的目录:

/log/**
!/log/*/
!/log/*/.gitkeep

如果没有这个设置,git 将不会查看被忽略的子目录。


1
这个不加上/log/*/*也不行,对吗? - gremo
1
或者将顶部行改为/log/** - jthill

2
一个改进了 @phd 的答案的变体,可以在任何子文件夹级别上工作,而不仅仅是第一层子目录:
# Ignore all files within a directory (recursively)
/log/**

# But do not ignore any directory or subdirectory it contains
!/log/**/

# Do not ignore a special file name
!.gitkeep

以下是测试情况:

.
└── log/
    ├── .gitkeep
    ├── dirA/
    │   ├── dirAA/
    │   │   ├── .gitkeep
    │   │   └── fileAAA.txt
    │   └── fileAA.txt
    ├── dirB/
    │   ├── .gitkeep
    │   └── fileBA.txt
    └── file.txt

现在,git add log/ 的结果如下:
user@machine$ git add log/
user@machine$ git status
On branch master

No commits yet

Changes to be committed:
  (use "git rm --cached <file>..." to unstage)
        new file:   log/.gitkeep
        new file:   log/dirA/dirAA/.gitkeep
        new file:   log/dirB/.gitkeep

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


注意:尽管git add只能添加文件(而不能添加空文件夹),但重要的是取消忽略文件夹(使用!/log/**/),否则Git甚至不会搜索这些文件夹中的.gitkeep文件。
(此外,请记住,**的意义仅为“可能包含任何字符,包括'/'的文件路径/名称”,而*则匹配除'/'以外的任何字符。)

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接