Git alias: как передать текущий каталог в команду оболочки?
Я использую git bash под Windows, и я хотел бы сделать команду git alias, которая концептуально выглядит примерно так:
[alias]
assume_unchanged_below = "!git ls-files -z $dir | xargs -0 git update-index --assume-unchanged"
куда $dir
расширяется до текущего рабочего каталога в оболочке bash, в которой git assume_unchanged_below
был выполнен.
Т.е. если я в C:\somedir\somesubdir
и выполнить git assume_unchanged_below
Я хотел бы, чтобы это было так, как будто я напечатал git ls-files -z C:\somedir\somesubdir | xargs -0 git update-index --assume-unchanged
Кажется, что можно получить текущий каталог через git rev-parse --show-prefix
, Я также знаю, что можно передавать аргументы, используя анонимную функцию, но я не смог объединить эти две концепции, чтобы получить желаемое поведение.
Например, если я сделаю это:
[alias]
assume_unchanged_below = "!f() { \
git ls-files -z $1 | xargs -0 git update-index --assume-unchanged; \
}; f"
Тогда я могу напечатать
git assume_unchanged_below `git rev-parse --show-prefix`
И ведет себя как положено ($1
правильно развернут в текущий рабочий каталог).
Однако я не хочу проходить вручную git rev-parse --show-prefix
к псевдониму, я хочу, чтобы он выводился автоматически, так что мне нужно только набрать
git assume_unchanged_below
заставить его работать в текущем рабочем каталоге.
Я пробовал это
[alias]
assume_unchanged_below = "!f() { \
git ls-files -z $1 | xargs -0 git update-index --assume-unchanged; \
}; f `git rev-parse --show-prefix`"
но это не работает правильно; $1
в f()
пустой. Предположительно, это потому, что новый процесс оболочки, который выполняет f()
имеет корневой каталог хранилища в качестве текущего каталога.
Можно ли вообще делать то, что я пытаюсь сделать в псевдониме git, или вместо этого мне нужно создать псевдоним в моем.bashrc?
-------------------- Обновление с ответом --------------------
Предложение @vampire об использовании $GIT_PREFIX сработало, потому что $GIT_PREFIX наследует свое значение от оболочки git, из которой был вызван исходный псевдоним.
Вот рабочий пример с украшениями для удобства использования:
[alias]
assumeallbelow = "!f() { \
if [ x"$1" != x ]; then \
echo "You cannot specify the directory because this command operates on all files in the current directory and below"; \
return; \
fi; \
echo "Marking all files under $GIT_PREFIX as assume-unchanged"; \
git ls-files -z $GIT_PREFIX | xargs -0 git update-index --assume-unchanged; \
}; f"