我想要的是理论上很简单.不知何故在Web应用程序的页脚中显示最新的提交ID号(hash?).所以当我查看Web应用程序时,我可以检查它是否正确提交和部署.
我可以想象有两种方法可以解决这个问题.第一个将是Git的一个可能的功能,允许输出提交ID.第二个将是一个后提交Web钩子(Beanstalk和GitHub都允许这一点).
有没有人找到了这样做的方法,或类似的东西?
谢谢,
丹尼
解决方法
但是让我们来看看不同的解决方案:
实时,服务器端脚本
如果您的网络应用程序是从非裸机存储库中实时部署的(希望您知道自己正在做什么wrt.推入非裸机器库,即具有检出/工作树的存储库),那么您的Web应用程序可以使用git rev-parse HEAD(提交SHA-1)或更好的git描述–dirty(–dirty选项将使返回的字符串包含信息,无论您是否在工作区域中进行了更改)或git describe –always HEAD.
git rev-parse HEAD给出了像7611062b4ba6d1ebc4cf3e63c11204a4f5057660这样的东西,而git描述–dirty给出了像v1.7.3.2-95-g7611062这样的东西(这意味着提交缩写为SHA-1的7611062,95提交后提交标记’v1.7.3′. 2′),但这取决于您使用带注释的标签来标记版本.
这样做的一个变体是让Web应用程序从位于同一文件系统上的其他位置的存储库中检查HEAD,例如.用git –git-dir = / path / to / .git描述HEAD.
Sidenote:如果你使用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结帐提供的Live,静态文件
编辑:添加部分2010-10-23 13:33 0000
如果您从非裸机git仓库(不是您的情况)的结帐(worktree)提供文件,则可以使用过滤器gitattribute的“smudge”和“clean”命令在checkout / checkin上执行类似CVS的关键字扩展.
在.gitattributes文件中,您将定义哪个过滤器属性应该执行的文件:
*.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"
涂抹过滤器将用例如“$Revision:$”替换. ‘$Revision:v1.7.3.2-95-g7611062’在结帐(这意味着检查的outfiles将包含这个类似CVS的关键字扩展).在git对象数据库(在git仓库中)存储文件内容时,干净的过滤器将删除扩展;否则你会有比较文件等问题.
使用git存档部署
如果您代替部署您的Web应用程序,那么它不会驻留在实时存储库(它的怪异wrt.推入它,并且有可能的安全性缺陷),并且您在某个地方使用git存档(例如,以压缩应用程序上传它到您的托管网站),您可以使用关键字替换.
首先,您需要告诉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.