我使用Git的bash在Windows下,我想作一个Git alias命令这在概念上是这样的:Git别名:如何将当前目录传递给shell命令?
[alias]
assume_unchanged_below = "!git ls-files -z $dir | xargs -0 git update-index --assume-unchanged"
凡$dir
扩展了当前工作目录在Bash shell中git assume_unchanged_below
被执行。
I.e.如果我在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进程将存储库根目录作为其当前目录。
它甚至有可能做我想在一个混帐别名,或者我需要在我的.bashrc中做一个别名,而不是做到这一点?
-------------------- Update With Answer --------------------
@吸血鬼使用$ 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"