[英]Show the latest commit value within a web application?
我有一些Rails應用程序,我使用Git作為版本控制系統。 我使用GitHub或Beanstalk作為存儲庫主機。
我想要的是理論上非常簡單。 以某種方式在Web應用程序的頁腳中顯示最新的提交ID號(哈希?)。 因此,當我查看Web應用程序時,我可以檢查它是否已正確提交和部署。
我可以想象有兩種方法可以解決這個問題。 第一個是Git的一個可能的特性,它允許輸出提交ID。 第二個是提交后的Web掛鈎(Beanstalk和GitHub都允許這樣做)。
有沒有人找到辦法做到這一點,或類似的東西?
謝謝,
丹尼
首先,澄清: post-commit
掛鈎無法在提交中將commit-id添加到文件中 ,因為提交ID取決於頂層樹的提交(代表頂層目錄),頂層樹的id依次取決於其成員的ID,以及文件的ID取決於其內容......此內容包含提交ID。 不可能。
但是讓我們來看看不同的解決方案:
如果你的網絡應用程序是從非裸git存儲庫實時部署的(我希望你知道你正在做什么。推入非裸存儲庫,即帶有結帳/工作樹的存儲庫),那么你的網絡應用程序可以使用git rev-parse HEAD
檢查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,在提交標記'v1.7.3后提交95次。 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'命令在checkout / checkin上執行類似CVS的關鍵字擴展。
在.gitattributes
文件中,您將定義filter
屬性應該在其上.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"
smudge
過濾器將在結帳時使用例如'$ Revision:v1.7.3.2-95-g7611062'替換'$ Revision:$'(這意味着已檢出的文件將包含擴展的類似CVS的關鍵字)。 在git對象數據庫中存儲文件內容時, clean
過濾器將刪除擴展(在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項目Makefile 使用sed
。
我相信你最終想要做的是,作為你的“構建”過程(部署,你的案例?)的一部分,存儲git rev-parse HEAD
或git describe HEAD
的輸出git describe HEAD
(更好的是,假設你標記版本) )在一個文件中。 然后,您的應用可以顯示該文件的內容。 提交哈希實際上不能成為任何跟蹤內容的一部分(提交的哈希值取決於跟蹤的內容)。 當然,如果您的應用程序用完了回購,您只需從應用程序運行該命令,但只需執行一次即可。
順便說一句,這是git本身采用的方法。 它有一個很小的shell腳本 ,它基本上將git describe
輸出轉儲到GIT-VERSION-FILE
,然后編譯它以提供版本信息。
希望我沒有誤解你的情況 - 我有點困惑你說“Git的一個可能的功能允許輸出提交ID”。 這是git的一個非常基本的功能。
首先,回答您的問題,在ruby腳本中運行以下命令:
`git log -n1 | head -1`.split.last
第二:你用beanstalk作為存儲庫主機是什么意思? beanstalk不是排隊服務器嗎?
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.