如何编写可移植Git库脚本?
我通过在如何编写可移植Git库脚本?,git,portability,Git,Portability,我通过在/usr/local/libexec/Git中编写脚本并创建别名来调用自定义Git命令。例如: git config --global alias.graph '!/usr/local/libexec/git/git-graph' 棘手的是,我希望我的脚本是“可移植的”,因为安装Git的任何人都应该能够像我一样安装和运行我的脚本,而不会遇到缺少的依赖项 重要编辑:在@Schwern的回复之后,我意识到我必须添加更多的信息。将“安装Git的任何人”替换为“通过官方Git源提供的Git核心
/usr/local/libexec/Git
中编写脚本并创建别名来调用自定义Git命令。例如:
git config --global alias.graph '!/usr/local/libexec/git/git-graph'
棘手的是,我希望我的脚本是“可移植的”,因为安装Git的任何人都应该能够像我一样安装和运行我的脚本,而不会遇到缺少的依赖项
重要编辑:在@Schwern的回复之后,我意识到我必须添加更多的信息。将“安装Git的任何人”替换为“通过官方Git源提供的Git核心脚本与Git交互的任何人”。例如,调用git-rebase
执行。(你可以点击最后一个词;它是一个超链接,但并不是在所有浏览器中都是这样显示的。)我假设大多数Git用户都是这样,因为这是Git项目本身提供的默认值
根据我多年的写作经验,我知道期望一个即使是中等复杂度的shell脚本也能在曾经存在过的每一个类Unix操作系统上运行是徒劳的。然而,我认为在Git工作站之间存在一个公共的实用程序基础是合理的,至少足以避免在编写在这些工作站上运行的脚本时经常跳圈和踩蛋壳
以下是我对Git工作站的假设:
- git core目录中的所有脚本(例如,
/usr/libexec/git core
)自从被git安装放在那里以来都没有被更改
git-core
中的所有脚本都按预期运行(即与git维护人员的工作站或任何具有“正常”设置的人上的脚本相同)
- 安装的Git版本满足我决定用脚本支持的一些任意最低要求编辑:我所说的“任意”,实际上是指“方便”@Schwern准确地说出了我在这里真正想说的话
如何确定可用于在这些Git工作站上编写可移植脚本的实用程序的公共基础
Edit:我基本上是在寻找git主发行版中提供的git核心
脚本的依赖项列表。这将提供我所寻找的公共基础。除了“SVN工作站”甚至“Ruby工作站”,再也没有“Git工作站”了。它只是一台安装了Git的机器,用于处理或获取使用Git的项目。如果他们在Windows环境中,那就是Windows。如果他们在一台过时的Solaris机器上,那将是一个Solaris环境。由于Git现在是OSX的标准配置,所以每台OSX机器都是“Git工作站”
因为“Git workstation”包含Windows,并且Windows没有任何普通的shell实用程序,所以您根本不能使用shell。您最多只能依赖Git Bash附带的最小集合,但是有很多Windows/Git安装不使用Git Bash。相反,许多IDE都附带了Git
所有这些都不会改变编写可移植shell脚本的兼容性挑战。BSD vs Gnu vs某些商业怪兽,所有关于Windows的问题,都将仍然存在
这些改变都不是出于礼貌而安装第三方扩展。它们不进入/usr
,这是用于系统内容的,应该保持不变。它们的形式类似于/usr/local
甚至~/bin
。如果Git脚本位于用户的路径中
,那么它们就可以工作
关于你对Git的一些假设
git core目录中的所有脚本(例如/usr/libexec/git core)自从被git安装放在那里以来都没有被更改
这是一个公平的假设。。。如果存在的话。这里在OSX上没有/usr/libexec/git-core
,我也找不到任何等价物。我怀疑它们都被编译成二进制你不能假设Git是一堆脚本,甚至不能像MacPorts那样有兼容性硬链接
git core中的所有脚本都按预期运行(即与git维护人员的工作站或任何具有“正常”设置的工作站上的脚本相同)
同样,这是一个很好的假设,如果它们存在的话,它们不一定存在
安装的Git版本满足我决定用脚本支持的一些任意最低要求
与其武断,不如选择支持脚本所需功能且不会给您带来太大不便的最低版本。始终使用git--version检查它
考虑到所有这些,为了便于携带
- 直接使用git,而不是通过脚本
- 不要假设“git”不是一个名为
git
的二进制文件
- 让安装程序询问用户git二进制文件的位置
- 不要将自己的扩展转储到/usr/libexec中,将它们放在用户路径的某个地方
- 不要对要安装扩展的路径进行硬编码
- 不要在shell中或使用Unix实用程序编写任何内容
- 使用编译语言并提供二进制文件,或者使用常用的脚本语言(如Perl、Python或Ruby)并提供二进制包
没有“Git工作站”比有“SVN工作站”甚至“Ruby工作站”更重要。它只是一台安装了Git的机器,用于处理或获取使用Git的项目。如果他们在Windows环境中,那就是Windows。如果他们在一台过时的Solaris机器上,那将是一个Solaris环境。由于Git现在是OSX的标准配置,所以每台OSX机器都是“Git工作站”
因为“Git workstation”包括Windows,而Windows没有任何norma
git --exec-path
$ cat << 'end' > $HOME/scripts/git-statusy
? #! /bin/sh
? echo statusy: \$PATH is $PATH
? git status
? 'end'
$ chmod +x $HOME/scripts/git-statusy
$ git statusy
statusy: $PATH is /usr/local/libexec/git-core:[...snipped]
On branch master
... [snipped]