Git 使用 Sed 预提交动态注入分支名称

Git Pre-Commit Using Sed To Dynamically Inject Branch Name

我正在使用 git 预提交挂钩:

  1. 获取当前分支名称
  2. 将分支名称插入构建状态图像代码
  3. 在 README.md 文件中搜索 string/pattern,然后使用该 string/pattern 作为我要插入动态生成的构建状态图像的位置的标记。

请注意,我使用的是 OSX El Capitan v10.11.5,为了执行此代码,我必须在预提交脚本上 运行 chmod +x .git/hooks/pre-commit

这是我正在使用的代码:

#!/bin/bash

function git_branch {
    git rev-parse --abbrev-ref HEAD
}

branch=$(git_branch)
id="{{CODESHIP_CODE}}"

codeship_build_status="[ ![Codeship Status for ExampleUser/exampleRepo](https://codeship.com/projects/a99d9999-9b9f-9999-99aa-999k9b9b0999/status?branch=$branch)](https://codeship.com/projects/999999)"

sed -i -e "s%{{CODESHIP_CODE}}%$codeship_build_status%g" README.md

截至目前,代码可以正常工作。我的意思是:

  1. 正确搜索 README.md 文件
  2. 删除 string/pattern 标记
  3. codeship_build_status 变量替换 string/pattern 标记。

问题是这似乎并没有真正改变 git commit 之前的 README.md 文件,而是生成另一个名为 README.md-e [=17] 的文件=]

当我转到 git push 并查看存储库中的代码时,README.md 文件尚未更新,而是仍然包含 string/pattern 标记而不是更新的构建状态图像.具有讽刺意味的是,README.md 文件确实在我的本地开发分支中发生了变化。

关于如何解决此问题或可能导致此问题的原因有什么想法吗?

问题是sed -i。这告诉 sed 创建一个新文件,并使用新名称保留旧文件,使用下一个参数(在您的例子中,-e)作为后缀。

对于 sed 的 Mac 版本,您 必须 -i 提供限定参数。要使其与 gnu / linux 版本使用这些命令行选项执行相同的操作,您需要提供一个空白选项,如下所示:

sed -i '' -e "s%{{CODESHIP_CODE}}%$codeship_build_status%g" README.md