2

我在 Windows 下使用 git bash,我想做一个 git 别名命令,它在概念上是这样的:

[alias]
    assume_unchanged_below = "!git ls-files -z $dir | xargs -0 git update-index --assume-unchanged"

Where$dir扩展到执行的 bash shell 中的当前工作目录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()空的。这大概是因为正在执行的新 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" 
4

1 回答 1

6
git config alias.test '!git ls-files $GIT_PREFIX'
于 2016-12-08T16:15:15.670 回答