#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
не является спецификацией пути.