git - 跨平台 git 钩子(Hook)

标签 git shell cross-platform githooks

您如何跨各种平台(例如,*nix 和 windows)管理 git 预/后提交 Hook ?

针对此场景推荐的最佳做法是什么?

最佳答案

git 钩子(Hook)实际上与任何 shell 脚本没有什么不同,因为保持它们“跨平台”的最佳实践同样适用。细微差别在于,您也可能将 Windows *nix 仿真层作为这些 Hook 的主要用户,并且与大多数实际的 Unix 环境相比,这些可能相对较弱。

我刚刚将一个提交后 Hook (并编写了一个提交前 Hook )移植到默认的 Git for Windows,它使用 MINGW32。自上一版本对可用的脚本环境做出一些假设后,我必须做出一些更改:

  • 没有可用的 readlink,但无论如何它在 Windows 上都是无效的,所以我只是入侵检查了 which readlink 并且如果没有就没有操作
  • 重定向到 /dev/null 在 Windows 中不起作用,相反你必须重定向到 nul,为此我只是做了一个 uname - s 检查并设置要重定向到的变量
  • 没有可用的 mktemp,但由于它是我们最终要修剪的目录,所以我们使用了一个简单的硬编码目录名
  • 出于某种原因,通过 exec >>$out 重定向 STDOUT 在 MINGW32 中工作正常,但 exec 2>>$err 对 STDERR 没有(似乎默默地死去),所以不幸的是我们不得不避开这种重定向

除此之外,它按原样运行得很好,因为其中没有很多特定于平台的“东西”。因此,只要坚持制作跨平台脚本的最佳实践,这至少能让您完成 80% 的任务。之后,在您针对的所有各种环境中进行测试测试。

关于git - 跨平台 git 钩子(Hook),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/5235277/

相关文章:

linux-kernel - 从 x86 交叉编译 arm

git - 如何在我的电脑上使用我的 Github 帐户而不是其他帐户?

Git 扩展 "Create new repository"不工作

git - 如何最小化 git merge 冲突?

bash - 如何使用 Unix 变量在 session {bash} 中设置和保留值

linux - 如何在 bash 脚本中删除 "-"和开头的空格?

bash - 为什么 sudo -s 'printf "xx"' 无法处理换行符?

c++ - 如何在 CMake Superbuild 中查找 dll/so 文件

git - 罕见的 Git 服务器错误 : "Refused pubkey" (but the key is tested valid)

macos - 我可以在 Electron 中使用 OSX 原生 API