Git别名:如何将当前目录传递给shell命令?

Chr*_*ine 2 git alias working-directory git-bash git-alias

我在Windows下使用git bash,我想制作一个git alias命令,其概念上是这样的:

[alias]
    assume_unchanged_below = "!git ls-files -z $dir | xargs -0 git update-index --assume-unchanged"
Run Code Online (Sandbox Code Playgroud)

其中$dir扩展到git assume_unchanged_below执行的bash shell中的当前工作目录.

即如果我进入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"
Run Code Online (Sandbox Code Playgroud)

然后我可以输入

git assume_unchanged_below `git rev-parse --show-prefix`
Run Code Online (Sandbox Code Playgroud)

它的行为与预期一致($1正确扩展到当前工作目录).

但是,我不想手动传递git rev-parse --show-prefix给别名,我希望它自动推断,这样我只需要输入

git assume_unchanged_below
Run Code Online (Sandbox Code Playgroud)

让它在当前的工作目录上运行.

我试过这个

[alias]
    assume_unchanged_below = "!f() { \
       git ls-files -z $1 | xargs -0 git update-index --assume-unchanged; \
    }; f `git rev-parse --show-prefix`"
Run Code Online (Sandbox Code Playgroud)

但这不能正常工作; $1f()空.可能这是因为正在执行的新shell进程f()将存储库根目录作为其当前目录.

是否有可能在git别名中执行我想要做的事情,或者我是否需要在.bashrc中创建别名来实现此目的?

--------------------用答案更新--------------------

@vampire建议使用$ GIT_PREFIX,因为$ GIT_PREFIX从触发原始别名的git shell继承了它的值.

这是一个工作示例,其中包含可用性的装饰:

[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" 
Run Code Online (Sandbox Code Playgroud)

Vam*_*ire 6

git config alias.test '!git ls-files $GIT_PREFIX'
Run Code Online (Sandbox Code Playgroud)