【问题标题】:Git alias for git status lists files relative to repository rootgit status 的 Git 别名列出了相对于存储库根目录的文件
【发布时间】:2021-09-01 15:38:35
【问题描述】:

我有一堆 git 命令的简写别名。其中之一是git statgit status 的缩写。

我在我的全局 git 配置(位于~/.gitconfig)中将别名声明为

[alias]
stat = !"git status"

这工作正常,但出现了一个烦人的问题:当我在 git 存储库中时 git stat 总是显示相对于存储库根目录而不是当前目录的路径。

一个例子:

repo
├── .git
└── folder
    └── file
$ cd repo/folder
$ touch fileB
$ git stat
Untracked files:
  (use "git add <file>..." to include in what will be committed)
    folder/fileB
$ git status
Untracked files:
  (use "git add <file>..." to include in what will be committed)
    fileB

如您所见,git stat 相对于 repo 列出了 fileB,而 git status 相对于 repo/folder 列出了它。

我怎样才能使我的别名表现得像原始命令一样?

【问题讨论】:

  • 为什么你的! 在双引号之外?也许无关,但很奇怪。而且它也不需要,stat = "status" 很好(而且几乎没用......获得 2 次击键?)
  • 嗯,老实说不知道但不会改变任何东西。关于无用:你把线放在哪里?我认为stat 可读性强,但有点短,所以为什么不呢。
  • @RomainValeri:确实,无关:您可以根据需要在任何地方输入和退出双引号。 shell 的工作方式相同,这意味着有一种简单的方法可以为 sh 引用文本:对所有内容使用单引号,然后如果需要单引号,请短暂退出单引号,使用一次 \',然后重新输入单引号:echo 'He said, "Hello, don'\''t I know you?"'

标签: git


【解决方案1】:

您将别名注册为外部 shell 命令(以 ! 开头),该命令将从 repo 的根目录运行。

如果你想要一个已知 git 命令的快捷方式,设置一个简单的别名规则:

git config --global alias.stat status

这也适用于 git 命令的选项:

git config --global alias.stat "status -sb"

您将获得自动完成该命令所有已知选项的额外能力(因为 git 现在“理解”别名是什么)。

【讨论】:

  • 谢谢,正是我需要的!
【解决方案2】:

您遇到了这样一个事实,即别名 shell 命令是从工作树的顶层运行的。 记录在案,但它巧妙地隐藏在 the git config documentation 中,因为没有更好的地方可以放置它:

如果别名扩展以感叹号为前缀,则 将被视为 shell 命令。比如定义alias.new = !gitk --all --not ORIG_HEAD,调用git new是等价的 运行 shell 命令gitk --all --not ORIG_HEAD。注意 shell命令将从一个顶级目录执行 存储库,不一定是当前目录。 GIT_PREFIX 设置为通过从原始当前目录运行 git rev-parse --show-prefix 返回。见git-rev- parse[1]

您可以使用$GIT_PREFIX 来定位目标目录。不过,在这种特殊情况下,LeGEC's answer 指向使用简单别名,这是可行的方法。

【讨论】:

    猜你喜欢
    • 2013-06-01
    • 1970-01-01
    • 1970-01-01
    • 2017-02-16
    • 2012-07-30
    • 2013-04-16
    • 2012-08-11
    • 1970-01-01
    • 2015-01-31
    相关资源
    最近更新 更多