我想git clone
通过创建执行以下操作的包装器来修改命令 - 以便它使用本地缓存:
- 如果缓存中不存在存储库,请克隆它。
- 将其复制到所需位置。
但我该如何解析git clone
repository
用于获取?值的命令行参数看似微不足道;但我找不到好的解决方案。
看来这是由于命令行参数缺乏结构 - 有些可能是一个开关,有些可能后面跟着一个值等。在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 建议的那样。