11

Railsアプリケーションがいくつかあり、バージョン管理システムとしてGitを使用しています。リポジトリホストとしてGitHubまたはBeanstalkのいずれかを使用しています。

私がやろうとしていることは、理論的には非常に単純です。どういうわけか、Webアプリケーションのフッターに最新のコミットID番号(ハッシュ?)を表示します。そのため、Webアプリケーションを見ているときに、それが正しくコミットおよびデプロイされていることを確認できます。

これに取り組むには2つの方法があると想像できます。1つ目は、コミットIDの出力を可能にするGitの可能な機能です。2つ目は、コミット後のWebフックです(BeanstalkとGitHubの両方でこれが可能です)。

誰かがこれを行う方法、または同様の方法を見つけたことがありますか?

ありがとう、

ダニー

4

3 に答える 3

15

まず、明確化:コミット ID はトップ ツリー (トップ ディレクトリを表す) のコミットに依存し、トップ ツリーの ID はそのメンバーの ID に依存するため、post-commitフックはコミットでファイルcommit-id を追加できません。ファイルはその内容に依存します...そしてこの内容にはコミットIDが含まれます。ありえない。

しかし、さまざまなソリューションを見てみましょう。

ライブのサーバー側スクリプト

Web アプリが非裸の git リポジトリからライブでデプロイされている場合 (非裸のリポジトリ、つまりチェックアウト/作業ツリーを含むリポジトリにプッシュすることに関して何をしているのか知っていることを願っています)、Web アプリは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(つまり、「v1.7.3.2」とタグ付けされたコミットの後に 95 コミットの省略形の SHA-1 でコミットすることを意味7611062します)、注釈付きタグを使用してリリースにタグを付けることに依存します。

これの変種は、同じファイルシステムの別の場所にあるリポジトリから HEAD をチェックする Web アプリを持つことですgit --git-dir=/path/to/.git describe HEAD

補足: Ruby を使用している場合は、おそらくグリットライブラリを使用することをお勧めします。version に相当する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 リポジトリのチェックアウト (ワークツリー) からファイルを提供する場合 (状況ではない)、 gitattributeの「smudge」および「clean」コマンドをfilter 使用して、チェックアウト/チェックイン時に CVS のようなキーワード展開を実行します。

ファイルでは、属性が作用.gitattributesするファイルを定義します。filter

*.rb フィルター=commitid

たとえば、git config ファイル (たとえば.git/config) でフィルターを定義します。

[フィルター「commitid」]
        smudge = sed -e "s/\$Revision: ?\$/\$Revision: $(git rev-parse HEAD)\$/1"
        clean = sed -e "s/\$Revision: ?[^$]*\$/​​\$Revision: \$/1"

フィルターは、smudgeチェックアウト時に '$Revision: $' を '$Revision: v1.7.3.2-95-g7611062' などに置き換えます (これは、チェックアウトしたファイルにこの CVS のようなキーワードが展開されて含まれることを意味します)。フィルターは、cleanファイルの内容を git オブジェクト データベース (git リポジトリ内) に保存するときに展開を削除します。そうしないと、ファイルの比較などで問題が発生します。


を使用して展開git archive

代わりに Web アプリをデプロイするため、ライブ リポジトリに常駐せず (プッシュすることに関して癖があり、セキュリティ上の欠点がある可能性があります)、git archiveどこかを使用します (たとえば、アプリを圧縮してアプリにアップロードする)。ホスティング サイト) では、キーワード置換を利用できます。

まず、ファイル内のキーワードを に置き換えることを Git に伝える必要がありますgit archiveexport-substファイルに追加するなど、特定のファイルに設定することでそれを行い.gitattributesます

*.rb export-subst

次に、ページフッターを含む/生成するファイルに追加します。

$フォーマット:%H$

これはコミット ハッシュに置き換えられます ( git-logマンページなどの pretty-formats の説明を参照してください)。


展開スクリプトを使用して展開

ある種のスクリプト/スクリプト化されたメカニズムを使用して Web アプリをデプロイする場合は、デプロイ スクリプトにバージョン情報を埋め込むというJefromi のアドバイスに従う必要があります。

Capistranoを post:deploymentに設定する方法 (デプロイに使用すると仮定) を他の誰かに尋ねる必要がありgit describe --always HEADます。そのために使用sedます。

于 2010-10-23T09:28:49.803 に答える
4

最終的にやりたいことは、「ビルド」プロセス(展開、あなたのケースですか?)の一部として、git rev-parse HEADまたはgit describe HEAD(リリースにタグを付けたと仮定すると)の出力をファイルに保存することだと思います。その後、アプリはファイルの内容を表示できます。コミット ハッシュは、実際には追跡されたコンテンツの一部になることはできません (コミットのハッシュは、追跡されたコンテンツに依存します)。もちろん、アプリのリポジトリが不足している場合は、アプリからコマンドを実行するだけでもかまいませんが、1 回だけ実行する方がはるかに洗練されています。

ちなみに、これは git 自体が採用しているアプローチです。基本的に出力をにダンプする小さなシェルスクリプトがあり、バージョン情報を提供するためにコンパイルされます。git describeGIT-VERSION-FILE

あなたの状況を誤解していないことを願っています.「コミットIDの出力を可能にするGitの機能の可能性」とあなたが言っていることに少し混乱しています. これは git の非常に基本的な機能です。

于 2010-10-22T18:07:08.360 に答える
0

まず、質問への回答として、Ruby スクリプトで次のコマンドを実行します。

`git log -n1 | head -1`.split.last

2 番目: Beanstalk をリポジトリ ホストとして使用するとはどういう意味ですか? Beanstalk はキューイングサーバーではありませんか?

于 2010-10-22T18:09:12.307 に答える