Игнорировать каталог

#bash #git

Вопрос:

Я пытаюсь игнорировать каталог, когда делаю различие с главной ветвью

 changed=()
while IFS='' read -r line; do changed =("$line"); done < <(git --no-pager diff --':!modules*' origin/master --name-only | sed 's#(.*)/.*#1#' | uniq)
echo "Files changed: ${changed[*]}"
 

структура папок: Я хочу игнорировать любые модули/* каталог.

 script.sh 
dev-1
  - nonprod 
      - dir1
      - dir2
  - prod
      - testdir1
      - testdir2
dev-2
  - modules
     - content-dir
  - nonprod
     - content-dir
  - prod
 

Ответ №1:

Вы переборщили, написав этот сценарий bash, пытаясь компенсировать то, что на самом деле является просто опечаткой:

 git --no-pager diff --':!modules*'
 

Это должно быть:

 git --no-pager diff -- ':!modules*'
 

Обратите внимание на пробел SPACEмежду двумя тире и ':!modules*' спецификацией пути.

(Если вы хотите игнорировать modules и все его подкаталоги, :!modules этого достаточно. * В конце Git будет пропускать файлы или каталоги с именами, например, modulesfrink и moduleszoidberg , а также modules , так что, вероятно, это безвредно.)

Отдельно аргумент ветви к git diff , а также --name-only часть, должны стоять перед -- , так что вам действительно нужно:

 git --no-pager diff origin/master --name-only -- ':!modules'
 

Тот -- , окруженный пробелами с обеих сторон, говорит Git: все, что после этого, является спецификацией пути. While :!modules является спецификацией origin/master пути и --name-only не является спецификацией пути.