我在Windows下使用git bash,我想制作一个git alias命令,其概念上是这样的:
[alias]
assume_unchanged_below = "!git ls-files -z $dir | xargs -0 git update-index --assume-unchanged"
$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"
然后我可以输入
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()
的新shell进程将存储库根目录作为其当前目录。
是否有可能做我在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"
答案 0 :(得分:6)
git config alias.test '!git ls-files $GIT_PREFIX'