是否可以自动解析命令的参数?

是否可以自动解析命令的参数?

我想git clone通过创建执行以下操作的包装器来修改命令 - 以便它使用本地缓存:

  1. 如果缓存中不存在存储库,请克隆它。
  2. 将其复制到所需位置。

但我该如何解析git clonerepository用于获取?值的命令行参数看似微不足道;但我找不到好的解决方案。

看来这是由于命令行参数缺乏结构 - 有些可能是一个开关,有些可能后面跟着一个值等。在git这种情况下<repository>可以后面跟着一个可选<directory>参数,所以我不能总是去通过最后一个参数。如果 CLI 参数能够像字典等那样更加结构化,那就太好了。

有没有办法至少指定文档中指定的语法,以便我可以使用repository诸如 之类的工具自动获取参数getopts

注意:我使用多种工具——Jenkins、Buildout 等——git使用命令自动下载存储库git;所以我认为包装器是最好的解决方案。

还有一些git特定的解决方案值得一试,例如本地 git 服务器、URL 重写等。

答案1

您可以循环遍历命令的参数来搜索@https://在命令中查找存储库,然后解析 URL 以提取您需要的内容

例如在Python中:


import sys

if len(sys.argv) > 1:
    for i in sys.argv:
        # Do whatever you want (parsing the URL...)

答案2

我想出了一个 hacky 脚本:/usr/local/bin/git它使用了尼古拉斯提到的想法。它依赖于最新版本的 Git 中提供的--reference-if-able和功能。--dissociate

#!/usr/bin/env bash

# The real executable is located at /usr/local/bin/tig.

command=$1

cache=$HOME/.cache/git/repositories

if [[ ! $command == "clone" ]]; then
    /usr/local/bin/tig "$@"
    exit
fi

caching=false

for argument in "${@:2}"; do
    case $argument in
        --reference | --reference-if-able)
            caching=false
            break
            ;;
        *[email protected]:*)
            caching=true
            [[ $argument == *.git ]] && argument=${argument%.git}
            folder=$cache/$argument
            ;;
    esac
done

if $caching; then
    echo "INFO: Using cache: $folder"
    /usr/local/bin/tig clone \
        --reference-if-able "$folder" --dissociate "${@:2}"
else
    /usr/local/bin/tig "$@"
fi

免责声明:这仅适用于开发用途。最好的方法是使用像 Goblet 这样的 Git 代理服务器,正如 Stephen 建议的那样。

相关内容