在我的zshshell 中,我根据我是否在git存储库中动态更改提示。我正在使用以下 git 命令来检查:
if $(git rev-parse --is-inside-work-tree >/dev/null 2>&1); then
...
Run Code Online (Sandbox Code Playgroud)
现在我还想区分当前目录是否被git. 所以我在我的if声明中又添加了一张支票:
if $(git rev-parse --is-inside-work-tree >/dev/null 2>&1) && ! $(git check-ignore . >/dev/null 2>&1); then
...
Run Code Online (Sandbox Code Playgroud)
这工作正常,但我想知道是否可以将其简化为一个git命令。由于在每个 上都会刷新提示ENTER,因此在某些较慢的机器上,它往往会显着降低 shell 的速度。
@Stephen Kitt 接受的解决方案效果很好,但以下情况除外:
我正在跨文件系统使用存储库。让我们说 git 驻留在/.git(因为我想跟踪我的配置文件/etc),但我也想跟踪一些文件/var/foo,这是一个不同的分区/文件系统。
当我位于/并执行以下命令时,一切都按预期工作,并且我得到返回代码1(因为/var/foo正在被跟踪):
# git check-ignore -q /var/foo
Run Code Online (Sandbox Code Playgroud)
但是,当我位于 中的任何位置时/var,相同的命令会失败并显示错误代码128和以下错误消息:
# git check-ignore -q /var/foo
fatal: not a git repository (or any parent up to mount point /)
Stopping at filesystem boundary (GIT_DISCOVERY_ACROSS_FILESYSTEM not set).
Run Code Online (Sandbox Code Playgroud)
但我认为这只是check-ignore命令的问题。否则 git 似乎可以跨文件系统正常工作。我可以/var/foo很好地跟踪文件。
预期的行为应该是git check-ignore -q /var/foo返回1,并git check-ignore -q /var/bar返回0如果没有被跟踪,。
我该如何解决这个问题?
Ste*_*itt 14
git check-ignore .如果.不在git存储库中(或发生任何其他错误),将失败并返回退出代码 128 ,并且仅当路径未被忽略时退出代码 1。所以你只能检查后者:
git check-ignore -q . 2>/dev/null; if [ "$?" -ne "1" ]; then ...
Run Code Online (Sandbox Code Playgroud)
在 中then,您正在处理.在 git 存储库中被忽略或不被忽略的情况。
要使这项工作跨越文件系统边界,请设置GIT_DISCOVERY_ACROSS_FILESYSTEM为true:
GIT_DISCOVERY_ACROSS_FILESYSTEM=true git check-ignore -q . 2>/dev/null; if [ "$?" -ne "1" ]; then ...
Run Code Online (Sandbox Code Playgroud)
Sté*_*las 12
首先应该是:
if
git rev-parse --is-inside-work-tree >/dev/null 2>&1 &&
! git check-ignore . >/dev/null 2>&1
then...
Run Code Online (Sandbox Code Playgroud)
命令替换 ( $(...)) 用于检索命令的输出。在这里,当您将其重定向到时没有输出/dev/null,如果有,它将被视为要执行的命令(并检查其退出状态)。
请注意,仅当第一个命令成功时才会运行第二个命令。
@StephenKitt 已经展示了如何将这两个命令分解为一个git命令,但如果这仍然无助于提高性能,您始终可以将信息缓存在关联数组中。
typeset -A is_git # declared globally in your ~/.zshrc
Run Code Online (Sandbox Code Playgroud)
if (( ! $+is_git[$PWD] )); then
git check-ignore -q . 2> /dev/null
is_git[$PWD]=$(( $? == 1 ))
fi
if (( $is_git[$PWD] )); then...
Run Code Online (Sandbox Code Playgroud)
如果您重命名目录、删除.git目录或更改被忽略文件的列表,该缓存可能会变得陈旧。你可以用它失效is_git=()或重新启动zsh用exec zsh。
另一种选择是仅在您使用chpwd钩子进入目录时才进行检查:
check_git() {
git check-ignore -q . 2> /dev/null
(( is_git = $? == 1 ))
}
chpwd_functions+=(check_git)
Run Code Online (Sandbox Code Playgroud)
然后,在你的提示例程中,这只是一个问题:
if (( is_git )); then...
Run Code Online (Sandbox Code Playgroud)
| 归档时间: |
|
| 查看次数: |
981 次 |
| 最近记录: |