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" 

1 ответ

Решение
git config alias.test '!git ls-files $GIT_PREFIX'
Другие вопросы по тегам