Webアプリケーション内の最新のコミット価値を表示しますか?
-
10-10-2019 - |
質問
Railsアプリケーションがいくつかあり、Gitをバージョン制御システムとして使用しています。 GithubまたはBeanStalkのいずれかをリポジトリホストとして使用します。
私がしようとしていることは、理論的には非常に単純です。どういうわけか、Webアプリケーションのフッターに最新のコミットID番号(Hash?)を表示します。そのため、Webアプリケーションを見ているときに、それがコミットされ、正しく展開されていることを確認できます。
これに取り組む2つの方法があると想像できます。 1つ目は、コミットIDの出力を可能にするGITの可能な機能です。 2つ目は、コミットポストのWebフックです(BeanStalkとGitHubの両方がこれを許可します)。
誰かがこれを行う方法や似たようなことを見つけたことがありますか?
ありがとう、
ダニー
解決
まず、説明: post-commit
フックはcommit-idをファイルに追加できません の コミットIDは、トップツリーのコミット(上部ディレクトリを表す)に依存し、上部ツリーのIDはメンバーのIDに依存し、ファイルのIDはそのコンテンツに依存します。 IDをコミットします。ありえない。
しかし、さまざまな解決策を見てみましょう。
ライブ、サーバーサイドスクリプト
Webアプリが非ベアGITリポジトリからライブで展開されている場合(WRTを何をしているのか知っている場合は、非ベアリポジトリ、つまりチェックアウト /ワーキングツリーを使用してリポジトリにプッシュします)、Webアプリは使用してヘッドを確認できます。 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
, 、95は「v1.7.3.2」とタグ付けされたコミット後にコミットしますが、注釈付きタグを使用してリリースをタグ付けすることに依存します。
これのバリアントは、同じファイルシステムのどこかにあるリポジトリからヘッドをチェックする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チェックアウトから提供されるライブ、静的ファイル
編集: セクションが追加された2010-10-23 13:33 +0000
非ベアGITリポジトリ(状況ではなく)のチェックアウト(WorkTree)からファイルを提供する場合、使用できます の「スマッジ」と「クリーン」コマンド filter
gitattribute チェックアウト /チェックインでCVSのようなキーワード拡張を実行します。
の .gitattributes
ファイルでファイルを定義します filter
属性は行動する必要があります:
*.rb filter=commitid
git configファイルでフィルターを定義します(例: .git/config
)、 例えば
[filter "commitid"] smudge = sed -e "s/\$Revision: ?\$/\$Revision: $(git rev-parse HEAD)\$/1" clean = sed -e "s/\$Revision: ?[^$]*\$/\$Revision: \$/1"
smudge
フィルターは「$ revision: '$'がEG '$ Revision:V1.7.3.2-95-G7611062'をチェックアウト時に置き換えます(これは、Checked OutfilesにこのCVSのようなキーワードが拡張されることを意味します)。 clean
フィルターは、gitオブジェクトデータベース(gitリポジトリ)にファイルコンテンツを保存するときに拡張を削除します。それ以外の場合は、ファイルなどの比較に問題があります。
の使用で展開 git archive
代わりにWebアプリを展開する場合、ライブリポジトリ(Quirks WRT。それに押し込まれ、セキュリティの欠点がある可能性がある)に存在しない場合、使用します。 git archive
どこか(例:zipアプリをホスティングサイトにアップロードする)、あなたは キーワード代替.
最初に、ファイル内のキーワードが置き換えられることをGitに伝える必要があります git archive
. 。設定してそれを行います export-subst
たとえば、追加して、指定されたファイルの場合 .gitattributes
ファイル
*.rb export-subst
そして、ページフッターを含む/生成するファイルに追加する
$Format:%H$
コミットハッシュに置き換えられます(かなり形式の説明を参照してください。 git-log マンページ)。
いくつかの展開スクリプトを使用して展開しました
Webアプリを展開するためにある種のスクリプト /スクリプトメカニズムを使用する場合は、フォローする必要があります ジェフロミのアドバイス 展開スクリプトがバージョン情報を埋め込んでいることの。
あなたは他の誰かに設定方法を尋ねなければならないでしょう カピストラーノ (展開に使用していると仮定)投稿するには:展開を交換します '@@ version @@' placeholder in Your 'app.rb'ファイルの結果と git describe --always HEAD
... gitプロジェクトMakefile 使用します sed
そのために.
他のヒント
私はあなたがやりたいと思っていることは、あなたの「ビルド」プロセスの一環として(展開、あなたのケース?)、の出力を保存することだと思います git rev-parse HEAD
また git describe HEAD
(リリースにタグを付けると仮定する方が良い)ファイル。アプリはファイルの内容を表示できます。コミットハッシュは実際に追跡されたコンテンツの一部ではありません(コミットのハッシュは追跡されたコンテンツに依存します)。もちろん、アプリがリポジトリから不足している場合は、アプリからコマンドを実行するだけですが、一度だけ行う方がはるかにエレガントです。
ちなみに、これはGit自体がとるアプローチです。それはあります Teeny Shell Script 基本的にダンプ git describe
に出力 GIT-VERSION-FILE
, 、バージョン情報を提供するためにコンパイルされます。
私はあなたの状況を誤解していないことを願っています - 私はあなたが「コミットIDの出力を可能にするGitの可能な機能」と言って少し混乱しています。これはGitの非常に基本的な機能です。
まず、質問に対する答えは、Rubyスクリプトで次のコマンドを実行します。
`git log -n1 | head -1`.split.last
2番目:BeanStalkをリポジトリホストとして使用するとはどういう意味ですか? BeanStalkはキューイングサーバーではありませんか?