在Web应用程序中显示最新的提交值?

我有几个Rails应用程序,我使用Git作为版本控制系统。 我使用GitHub或Beanstalk作为存储库主机。

我想要的是理论上非常简单。 以某种方式在Web应用程序的页脚中显示最新的提交ID号(哈希?)。 因此,当我查看Web应用程序时,我可以检查它是否已正确提交和部署。

我可以想象有两种方法可以解决这个问题。 第一个是Git的一个可能的function,它允许输出提交ID。 第二个是提交后的Web挂钩(Beanstalk和GitHub都允许这样做)。

有没有人找到办法做到这一点,或类似的东西?

谢谢,

丹尼

首先,澄清: post-commit挂钩不能在提交中将commit-id添加到文件 ,因为提交id取决于顶层树的提交(代表顶层目录),顶层树的id依次取决于其成员的ID,以及文件的ID取决于其内容……此内容包含提交ID。 不可能。

但是让我们来看看不同的解决方案:

实时,服务器端脚本

如果你的网络应用程序是从非裸git存储库实时部署的(我希望你知道你正在做什么。推入非裸存储库,即带有结帐/工作树的存储库),那么你的网络应用程序可以使用git rev-parse HEAD检查HEAD git rev-parse HEAD (提供提交的SHA-1),或者更好的git describe --dirty (– --dirty选项会使返回的字符串包含有关工作区域中是否有未经修改的更改的信息),或者git describe --always HEAD

git rev-parse HEAD给出类似7611062b4ba6d1ebc4cf3e63c11204a4f5057660 ,而git describe --dirty给出了类似v1.7.3.2-95-g7611062 (这意味着提交了7611062缩写SHA-1,在提交标记’v1.7.3后提交95次。 2’),但这取决于您使用带注释的标签标记版本。

这种方法的一个变体是让web应用程序检查来自存储库的HEAD,该存储库位于同一文件系统的其他位置,例如使用git --git-dir=/path/to/.git describe HEAD

旁注:如果你使用Ruby,你可能想要使用grit库。 相当于git rev-parse HEAD版本可能是(未经测试的!):

 require 'grit' include Grit repo = Repo.new("/var/git/app.git") head = repo.commits('HEAD', 1) app_version = head.id 

从git checkout提供的实时静态文件

编辑: 部分添加2010-10-23 13:33 +0000
如果您从非裸git存储库(不是您的情况)的checkout(worktree)提供文件,则可以使用filter gitattribute的 ‘smudge’和’clean’命令在checkout / checkin上执行类似CVS的关键字扩展。

.gitattributes文件中,您将定义filter属性应该在其上.gitattributes文件:

 * .rb filter = commitid

例如,您可以在git配置文件中定义filter(例如,在.git/config

 [filter“commitid”]
         smudge = sed -e“s / \ $ Revision:?\ $ / \ $ Revision:$(git rev-parse HEAD)\ $ / 1”
         clean = sed -e“s / \ $ Revision:?[^ $] * \ $ / \ $ Revision:\ $ / 1”

smudgefilter会在结帐时用’$ Revision:v1.7.3.2-95-g7611062’替换’$ Revision:$’(这意味着已检出的文件将包含扩展的类似CVS的关键字)。 在git对象数据库中存储文件内容时, cleanfilter将删除扩展(在git存储库中); 否则你会遇到比较文件等问题

部署使用git archive

如果您改为部署您的Web应用程序,那么它不会驻留在实时存储库中(它有它的怪癖。推入它,并且可能存在安全缺陷),并且您在某处使用git archive (例如,使用zip应用程序上传它)到您的托管网站),您可以使用关键字替换

首先,您需要告诉Git您希望将文件中的关键字替换为git archive 。 您可以通过为给定文件设置export-subst来实现,例如通过添加.gitattributes文件

 * .rb export-subst

然后添加到包含/生成页脚的文件中,例如

 $格式:%H $

将被提交哈希替换(参见git-log联机帮助页中的漂亮格式描述)。

使用某些部署脚本进行部署

如果您使用某种脚本/脚本机制来部署Web应用程序,则应遵循Jefromi的建议 , 即使您的部署脚本嵌入版本信息。

您将不得不问别人如何设置Capistrano (假设您使用它进行部署)发布:部署替换’@@ VERSION @@’占位符在您的’app.rb’文件中,结果为git describe --always HEAD … Git项目Makefile 使用sed

我相信你最终想要做的是,作为你的“构建”过程(部署,你的案例?)的一部分,存储git rev-parse HEADgit describe HEAD的输出git describe HEAD (更好,假设你标记版本)在一个文件中。 然后,您的应用可以显示该文件的内容。 提交哈希实际上不能成为任何跟踪内容的一部分(提交的哈希值取决于跟踪的内容)。 当然,如果您的应用程序用完了repo,您​​只需从应用程序运行该命令,但只需执行一次即可。

顺便说一句,这是git本身采用的方法。 它有一个很小的shell脚本 ,它基本上将git describe输出转储到GIT-VERSION-FILE ,然后编译它以提供版本信息。

希望我没有误解你的情况 – 我有点困惑你说“Git的一个可能的function,允许输出提交ID”。 这是git的一个非常基本的function。

首先,回答你的问题,在你的ruby脚本中运行以下命令:

 `git log -n1 | head -1`.split.last 

第二:你用beanstalk作为存储库主机是什么意思? beanstalk不是排队服务器吗?