dan*_*mcc 9 git version-control ruby-on-rails github amazon-elastic-beanstalk beanstalk-svn
我有几个Rails应用程序,我使用Git作为版本控制系统.我使用GitHub或Beanstalk作为存储库主机.
我想要的是理论上非常简单.以某种方式在Web应用程序的页脚中显示最新的提交ID号(哈希?).因此,当我查看Web应用程序时,我可以检查它是否已正确提交和部署.
我可以想象有两种方法可以解决这个问题.第一个是Git的一个可能的特性,它允许输出提交ID.第二个是提交后的Web挂钩(Beanstalk和GitHub都允许这样做).
有没有人找到办法做到这一点,或类似的东西?
谢谢,
丹尼
Jak*_*ski 15
首先,澄清:post-commit钩不能添加提交-ID到文件中提交,因为提交ID取决于顶树的承诺(代表上层目录),又顶树的ID取决于其成员的ID和一个ID文件取决于其内容......此内容包含提交ID.不可能.
但是让我们来看看不同的解决方案:
如果你的网络应用程序是从非裸git存储库实时部署的(我希望你知道你正在做什么.推入非裸存储库,即带有结账/工作树的存储库),那么你的网络应用程序可以通过使用git rev-parse HEAD(检查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在提交标记'v1.7.3.2'之后提交缩写的SHA- 1,95提交),但它取决于您使用带注释的标记标记版本.
这种方法的一个变体是让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
Run Code Online (Sandbox Code Playgroud)
编辑: 添加的部分2010-10-23 13:33 +0000
如果你从非裸git存储库的checkout(worktree)提供你的文件(不是你的情况),你可以使用 gitattribute的 'smudge'和'clean'命令filter 来在结帐/签到时执行类似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过滤器将取代"$修订:$"与如"$修订:v1.7.3.2-95-g7611062"结账(这意味着检查outfiles将包含扩大这个类似CVS的关键字).clean在git对象数据库中存储文件内容时,过滤器将删除扩展(在git存储库中); 否则你会遇到比较文件等问题
git archive如果您改为部署您的Web应用程序,那么它不会驻留在实时存储库中(它有它的怪癖.推入它,并且存在可能的安全缺陷),并且您在git archive某处使用(例如,使用zip应用程序将其上传到您的托管网站),您可以使用关键字替换.
首先,您需要告诉Git您希望将文件中的关键字替换为git archive.您可以通过设置export-subst给定文件来执行此操作,例如通过添加到.gitattributes文件
*.rb export-subst
然后添加到包含/生成页脚的文件中,例如
$Format:%H$
这将被提交哈希替换(参见git-log联机帮助页中的漂亮格式描述).
如果您使用某种脚本/脚本机制来部署Web应用程序,则应遵循Jefromi的建议,即使您的部署脚本嵌入版本信息.
您将不得不问别人如何设置Capistrano(假设您使用它进行部署)发布:部署在'app.rb'文件中替换'@@ VERSION @@'占位符,结果为git describe --always HEAD... Git project Makefile 使用sed该.
| 归档时间: |
|
| 查看次数: |
4088 次 |
| 最近记录: |