跨平台的 Git 钩子

24

如何在不同平台(例如*nix和windows)之间管理git的pre/post commit hooks?

针对这种情况,是否有任何最佳实践建议?

1个回答

17

Git 钩子与任何 Shell 脚本并没有太大区别,因此保持“跨平台”的最佳实践同样适用。唯一的区别是你可能也要针对 Windows *nix 模拟层作为这些钩子主要用户,而相比于大多数实际的 Unix 环境,这些模拟层相对不稳定。

我刚刚将一个 post-commit 钩子(还编写了一个 pre-commit 钩子)移植到默认的 Git for Windows 中,它使用的是 MINGW32。 由于之前的版本做出了一些关于可用脚本环境的假设,我不得不进行一些更改:

  • 没有可用的 readlink,但在 Windows 上无效,因此我检查了 which readlink 并在没有时进行了一些操作
  • 在 Windows 中无法重定向到 /dev/null,而需要重定向到 nul,因此我进行了 uname -s 检查,并设置了一个变量以确定重定向位置
  • 没有可用的 mktemp,但由于最终会删除它,所以我们使用了一个简单的硬编码目录名
  • 由于某种原因,在 MINGW32 中通过 exec >>$out 重定向 STDOUT 可以正常工作,但通过 exec 2>>$err 重定向 STDERR 不行(它似乎会默默死亡),因此不幸的是我们只好放弃这种重定向

除此之外,由于其中没有太多特定于平台的“东西”,所以它完全可以按原样运行。所以要遵循制作跨平台脚本的最佳实践,这将让你至少达到 80% 的目标。之后,请在针对的各种环境中进行测试测试测试。


8
当然,一个 git 钩子并不一定要是 shell 脚本 - 实际上,在 git 的 contrib 目录中至少有一个使用 Perl 编写的钩子。 - Cascabel
@Jefromi 说得好,不过 [shell] 标签让我相信他是在使用 shell 脚本,但也许他不知道必须这样做,所以 +1。 - Daniel DiPaolo

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接