2016-12-08 45 views
1

我使用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`" 

,但这不能正常工作; $1f()为空。大概这是因为执行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" 

回答

4
git config alias.test '!git ls-files $GIT_PREFIX' 
相关问题