【问题标题】:How are git arguments parsed?git 参数是如何解析的?
【发布时间】:2016-11-02 21:10:37
【问题描述】:

我正在开发自己的库来解析 argc/argv 数据。我在想git。 git 参数是如何工作的?

例子:

git commit -m "消息"

这里,commit 不是一个选项,因为它没有连字符。有没有地方解释过这种命令行选项行为?

我知道我的库会比 TCLAP 或 CLAP 差,但我不能使用外部库。

编辑:有趣的链接 -> https://softwareengineering.stackexchange.com/questions/70357/command-line-options-style-posix-or-what

【问题讨论】:

  • argparse,用于解析命令行参数的 Python 标准库,将这种类型的参数称为子命令。

标签: git command command-line-interface


【解决方案1】:

Git 似乎有不同的命令,所以你可以做git statusgit add 等。所以从用户的角度来看,git commit 似乎是对命令git 的调用,其中commit是第一个参数 - 当您使用 argc/argv 时,绝对没有规定您的参数必须以破折号开头或采用其他格式。

Git 的有趣之处在于它也是可扩展的。如果您在路径中的某处创建了一个名为 git-hello 的脚本(注意单个单词,带有破折号),那么您可以在命令行上通过 git hello 调用它,使其与“真正的”Git 命令无法区分。

您可能从上面猜到实际上有单独的程序称为git-commitgit-status 等等,这是一个正确的猜测。浏览man 页面时值得注意,因为您可以执行man git-commit 之类的操作。 Git 实际上确实有一个执行路径,这些脚本所在的位置,你可以通过运行git --exec-path 找到它。在我的系统上,/usr/lib/git-core 有一堆单独的脚本和符号链接返回到 Git。

所以 Git 实际上在参数处理方面与大多数程序完全不同。您可以看到其他标准实用程序如何在其源代码中处理其命令行参数。例如,this is the source for cat 在其 GNU 实现中。如果你去他们的main,你会注意到参数处理是通过getopt_long函数,与getoptdescribed in GNU docs一起是glibc的一部分。

【讨论】:

猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2015-12-23
  • 2015-11-16
  • 2011-01-28
  • 2014-10-28
  • 2019-11-01
  • 1970-01-01
  • 2012-04-25
相关资源
最近更新 更多