我有一些Rails应用程序,我使用Git作为版本控制系统。我使用GitHub或Beanstalk作为存储库主机。
我想要的是理论上非常简单。以某种方式在Web应用程序的页脚中显示最新的提交ID号(哈希?)。因此,当我查看Web应用程序时,我可以检查它是否已正确提交和部署。
我可以想象有两种方法可以解决这个问题。第一个是Git的一个可能的特性,它允许输出提交ID。第二个是提交后的Web挂钩(Beanstalk和GitHub都允许这样做)。
有没有人找到这样做的方法,或类似的东西?
谢谢,
丹尼
答案 0 :(得分:15)
首先,澄清:post-commit
挂钩无法将commit-id添加到 提交中,因为提交ID取决于顶层树的提交(代表顶层目录),id为top tree依赖于其成员的id,文件的id取决于其内容......此内容包括commit id。不可能。
但让我们来看看不同的解决方案:
如果你的网络应用程序是从非裸git存储库实时部署的(我希望你知道你正在做什么。推入非裸存储库,即带有结帐/工作树的存储库),那么你的网络应用程序可以检查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提交,95提交后提交标记为“v1.7.3.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
编辑: 部分已添加2010-10-23 13:33 +0000
如果你从非裸git存储库的checkout(worktree)提供你的文件(不是你的情况),你可以使用filter
gitattribute 'smudge'和'clean'命令>在结账/签到时执行类似CVS的关键字扩展。
在.gitattributes
文件中,您将定义filter
属性应该采取行动的文件:
*.rb filter=commitid
您可以在git配置文件中定义过滤器(例如在.git/config
中),例如
[filter "commitid"] smudge = sed -e "s/\$Revision: ?\$/\$Revision: $(git rev-parse HEAD)\$/1" clean = sed -e "s/\$Revision: ?[^$]*\$/\$Revision: \$/1"
smudge
过滤器会将'$ Revision:$'替换为例如结账时'$ Revision:v1.7.3.2-95-g7611062'(这意味着已检查的outfiles将包含此类CVS关键字扩展)。将文件内容存储在git对象数据库中时,clean
过滤器将删除扩展(在git存储库中);否则你会遇到比较文件等问题。
git archive
如果你改为部署你的网络应用程序,那么它不会驻留在实时存储库中(它有它的怪癖。推进它,并且有可能的安全缺陷),并且你在某处使用git archive
(例如要将应用程序压缩到您的托管网站,您可以使用关键字替换。
首先,您需要告诉Git您希望文件中的关键字替换为git archive
。您可以通过为给定文件设置export-subst
来执行此操作,例如添加到.gitattributes
文件
*.rb export-subst
然后添加到包含/生成页脚的文件,例如
$Format:%H$
将被提交哈希替换(请参阅git-log联机帮助页中的漂亮格式说明。)
如果您使用某种脚本/脚本机制来部署您的Web应用程序,则应遵循Jefromi advice部署脚本嵌入版本信息。
您将不得不问别人如何设置Capistrano(假设您使用它进行部署)发布:部署将'@@ VERSION @@'占位符替换为'app.rb'文件中的结果git describe --always HEAD
... Git项目Makefile uses sed
for that。
答案 1 :(得分:4)
我相信你最终想要做的是,作为“构建”过程(部署,你的案例?)的一部分,存储git rev-parse HEAD
或git describe HEAD
的输出(更好,假设您在文件中标记版本)。然后,您的应用可以显示该文件的内容。提交哈希实际上不能成为任何跟踪内容的一部分(提交的哈希值取决于跟踪的内容)。当然,如果您的应用程序用完了repo,您只需从应用程序运行该命令,但只需执行一次就可以更加优雅。
顺便说一句,这是git本身采用的方法。它有一个teeny shell script,基本上将git describe
输出转储到GIT-VERSION-FILE
,然后编译输出以提供版本信息。
希望我没有误解你的情况 - 我对你说“允许输出提交ID的Git的一个可能功能”感到有些困惑。这是git的一个非常基本的功能。
答案 2 :(得分:0)
首先,回答你的问题,在你的ruby脚本中运行以下命令:
`git log -n1 | head -1`.split.last
第二:你用beanstalk作为存储库主机是什么意思? beanstalk不是排队服务器吗?