Git 别名:如何将当前目录传递给 shell 命令?
Git alias: how to pass current directory to shell command?
我在 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 | xargs -0 git update-index --assume-unchanged; \
}; f"
然后我可以输入
git assume_unchanged_below `git rev-parse --show-prefix`
它的行为符合预期(</code> 已正确扩展到当前工作目录)。 </p>
<p>但是,我不想手动将 <code>git rev-parse --show-prefix
传递给别名,我希望自动推断它,这样我只需要输入
git assume_unchanged_below
让它在当前工作目录上运行。
我已经试过了
[alias]
assume_unchanged_below = "!f() { \
git ls-files -z | xargs -0 git update-index --assume-unchanged; \
}; f `git rev-parse --show-prefix`"
但这不能正常工作; f()
中的 </code> 为空。据推测这是因为正在执行 <code>f()
的新 shell 进程将存储库根目录作为其当前目录。
我什至可以在 git 别名中做我想做的事情,还是我需要在我的 .bashrc 中创建一个别名来完成这个?
--------------------
更新答案
------------------
@vampire 关于使用 $GIT_PREFIX 的建议奏效了,因为 $GIT_PREFIX 从触发原始别名的 git shell 继承了它的值。
这是一个工作示例,带有可用性的修饰:
[alias]
assumeallbelow = "!f() { \
if [ x"" != 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'
我在 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 | xargs -0 git update-index --assume-unchanged; \
}; f"
然后我可以输入
git assume_unchanged_below `git rev-parse --show-prefix`
它的行为符合预期(</code> 已正确扩展到当前工作目录)。 </p>
<p>但是,我不想手动将 <code>git rev-parse --show-prefix
传递给别名,我希望自动推断它,这样我只需要输入
git assume_unchanged_below
让它在当前工作目录上运行。
我已经试过了
[alias]
assume_unchanged_below = "!f() { \
git ls-files -z | xargs -0 git update-index --assume-unchanged; \
}; f `git rev-parse --show-prefix`"
但这不能正常工作; f()
中的 </code> 为空。据推测这是因为正在执行 <code>f()
的新 shell 进程将存储库根目录作为其当前目录。
我什至可以在 git 别名中做我想做的事情,还是我需要在我的 .bashrc 中创建一个别名来完成这个?
-------------------- 更新答案 ------------------
@vampire 关于使用 $GIT_PREFIX 的建议奏效了,因为 $GIT_PREFIX 从触发原始别名的 git shell 继承了它的值。
这是一个工作示例,带有可用性的修饰:
[alias]
assumeallbelow = "!f() { \
if [ x"" != 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'