.gitignore排除(不忽略)二級以上目錄下的文件或目錄

在.gitignore中,結合使用/*!filename的語法,能夠達到除特定文件或目錄外所有忽略的目的。但當但願不忽略的文件或目錄在二級或多級目錄下時,若是這樣寫git

/*
!/sub/subsub/ 
code

是不能達到預期效果的,這會致使根目錄下的所有文件被忽略,包括/sub/subsub/。由於.gitignore語法中,!filename只能對同級的/*生效,所以若是要在根目錄中排除多級目錄中的文件,須要重複地指明每一級目錄的忽略規則。下面以忽略根目錄中的所有文件,但不忽略/1st/2nd/目錄中的tgt文件爲例:ip

/*
!/1st/2nd/tgt #Wrong! Still ignored.



/*
!/1st/

/1st/*
!/1st/2nd/

/1st/2nd/*
!/1st/2nd/tgt
#Correct! Specify rules for each directory.
ci


當目錄變得足夠深,或者這樣的目錄不少時,能夠預料編寫.gitignore的工做會變得極其繁複而易錯。爲此,我寫了一段Javascript腳本以自動化這一流程: get

str => {
  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;
}
it


使用示例:自動化

(str => {
  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
*/
io


參考連接file

相關文章
相關標籤/搜索