在.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