Git 别名 : how to pass current directory to shell command?

标签 git alias git-bash git-alias working-directory

我在 Windows 下使用 git bash,我想创建一个概念上类似这样的 git 别名命令:

[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`"

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

最佳答案

git config alias.test '!git ls-files $GIT_PREFIX'

关于Git 别名 : how to pass current directory to shell command?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/41043051/

相关文章:

git - 为什么在 merge pull 请求时需要将开发分支 merge 到功能分支?

windows - 如何从 git bash 执行 .bat 然后返回控制台?

python - 使用 Bamboo 时重新标记后,Git 标签链接到旧提交

python - Shell 脚本无法识别别名

bash - 如何从任何子项目目录启动正确版本的gradle?

indexing - 如何创建排除特定字段的Elasticsearch索引别名

Git 预提交钩子(Hook)在文件中查找文本

Git 创建完整的文件补丁以下载/分发?

python - 在 gitpython 中获取特定文件的所有修订

git - 删除git分支会失去审核