我有一些导轨应用程序,我将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不是排队的服务器吗?

许可以下: CC-BY-SA归因
不隶属于 StackOverflow
scroll top