在.gitignore中,结合使用/*
和!filename
的语法,能够达到除特定文件或目录外所有忽略的目的。但当但愿不忽略的文件或目录在二级或多级目录下时,若是这样写git
/*
code
!/sub/subsub/
是不能达到预期效果的,这会致使根目录下的所有文件被忽略,包括/sub/subsub/。由于.gitignore语法中,!filename
只能对同级的/*
生效,所以若是要在根目录中排除多级目录中的文件,须要重复地指明每一级目录的忽略规则。下面以忽略根目录中的所有文件,但不忽略/1st/2nd/目录中的tgt文件为例:ip
/*
!/1st/2nd/tgt #Wrong! Still ignored.
/*
ci
!/1st/
/1st/*
!/1st/2nd/
/1st/2nd/*
!/1st/2nd/tgt
#Correct! Specify rules for each directory.
当目录变得足够深,或者这样的目录不少时,能够预料编写.gitignore的工做会变得极其繁复而易错。为此,我写了一段Javascript脚本以自动化这一流程: get
str => {
it
let arr = str.split("/");
arr = arr.map((e, i) => arr.slice(0, i+1).join("/"));
arr.shift();
const trail = `!${arr.pop()}`;
arr = arr.map(e => `!${e}/\n${e}/*\n`);
return arr.join("") + trail;
}
使用示例:自动化
(str => {
io
let arr = str.split("/");
arr = arr.map((e, i) => arr.slice(0, i+1).join("/"));
arr.shift();
const trail = `!${arr.pop()}`;
arr = arr.map(e => `!${e}/\n${e}/*\n`);
return arr.join("") + trail;
})("/1st/2nd/tgt")
/*
Output:
!/1st/
/1st/*
!/1st/2nd/
/1st/2nd/*
!/1st/2nd/tgt
*/
参考连接file