在Web应用程序中显示最新的提交值?
-
10-10-2019 - |
题
我有一些导轨应用程序,我将GIT用作版本控制系统。我使用github或beanstalk作为存储库主机。
从理论上讲,我试图做的非常简单。以某种方式在Web应用程序的页脚中显示最新的提交ID号(哈希?)。因此,当我查看Web应用程序时,我可以检查它是否正确和部署。
我可以想象有两种方法可以解决这个问题。第一个是GIT的可能功能,允许提交ID的输出。第二个将是邮政的Web挂钩(Beanstalk和Github都允许此钩)。
有没有人找到这样做的方法或类似的方法?
谢谢,
丹尼
解决方案
首先,澄清: post-commit
钩子无法添加fors-id file 在 提交,因为提交ID取决于顶部树的提交(表示顶部目录),因此顶部树的ID依次取决于其成员的ID,并且文件的ID取决于其内容...提交ID。不可能。
但是,让我们看一下不同的解决方案:
实时,服务器端脚本
如果您的Web应用程序是从非bare git存储库中实时部署的(我希望您知道您在做什么。 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
(这意味着要与缩写的SHA-1合作 7611062
, ,在提交标记为“ v1.7.3.2')之后进行95次提交,但这取决于您使用带注释的标签标记版本。
其中一个变体是让Web应用程序从存储库中检查头部,该库在同一文件系统上的其他地方,例如 git --git-dir=/path/to/.git describe HEAD
.
边注: 如果您使用Ruby,您可能想使用 砂砾 图书馆。等效 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
如果您从非bare git存储库的结帐(Worktree)(不是您的情况)提供文件,则可以使用 “污迹”和“干净”命令 filter
gitattribute 要在结帐 / Checkin上执行类似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'(这意味着检查OuteDETFILES将包含此类似CVS的关键字扩展)。这 clean
将文件内容存储在GIT对象数据库中(在GIT存储库中)时,过滤器将删除扩展;否则,您将在比较文件等方面遇到问题。
通过使用 git archive
如果您改为部署Web应用程序,因此它不在实时存储库中(它的Quirkswrt。将其推入其中,并且可能存在安全性缺陷),并且您可以使用 git archive
在某个地方(例如,zip应用将其上传到您的托管网站),您可以使用 关键字替代.
首先,您需要告诉git,您需要在被替换的文件中的关键字 git archive
. 。您通过设置来做到这一点 export-subst
对于给定的文件,例如通过添加到 .gitattributes
文件
*.rb export-subst
然后添加到包含/生成页面的文件中
$Format:%H$
它将被提交哈希取代(请参阅“漂亮形式说明” git-log manpage)。
部署,使用一些部署脚本
如果您使用某种脚本 /脚本机制来部署您的Web应用程序,则应关注 Jefromi建议 使您的部署脚本嵌入式版本信息。
您将不得不问别人如何设置 Capistrano (假设您将其用于部署)发表:部署替换'@@版本@@'app.rb'文件中的占位符,结果 git describe --always HEAD
... git项目makefile 用途 sed
为了那个原因.
其他提示
我相信您最终想做的是作为您“构建”过程的一部分(部署,案例?),存储输出的输出 git rev-parse HEAD
或者 git describe HEAD
(更好的是,假设您标记发行版)在文件中。然后,您的应用程序可以显示文件的内容。提交哈希实际上永远不可能成为任何跟踪内容的一部分(提交的哈希都取决于跟踪的内容)。当然,如果您的应用程序用完了存储库,则可以简单地从应用程序中运行该命令,但是只能完成一次,它更加优雅。
顺便说一句,这是git本身采取的方法。它有一个 青少年壳脚本 这基本上是倾倒 git describe
输出到 GIT-VERSION-FILE
, 然后,将其编译以提供版本信息。
希望我不会误解您的情况 - 您对您说“ GIT的可能功能可以使COMMIT ID的输出”感到有些困惑。这是Git的非常基本的功能。
首先,您的问题的答案,在Ruby脚本中运行以下命令:
`git log -n1 | head -1`.split.last
第二:您是什么意思,您将Beanstalk用作存储库主机? Beanstalk不是排队的服务器吗?