質問

最近質問したのは、 Git でのキーワード拡張 そして、Git でこのアイデアを実際にはサポートしない設計を喜んで受け入れます。

良くも悪くも、私が現在取り組んでいるプロジェクトでは、次のような SVN キーワード拡張が必要です。

svn propset svn:keywords "Id" expl3.dtx

この文字列を最新の状態に保つには:

$Id: expl3.dtx 803 2008-09-11 14:01:58Z will $

しかし、バージョン管理には Git を使用したいと考えています。残念ながら、ドキュメントによると、git-svn はこれをサポートしていません。

「svn:executable を除くすべての SVN プロパティを無視します」

しかし、このキーワードをいくつかのコミット前後のフックでエミュレートするのは、それほど難しいことではないようです。これを欲しがったのは私が初めてですか?これを行うためのコードを持っている人はいますか?

役に立ちましたか?

解決

何が起きてる:Git は、ブランチ間をできるだけ早く切り替えるように最適化されています。特に、 git checkout は、両方のブランチで同一のファイルには触れないように設計されています。

残念ながら、RCS キーワード置換はこれを壊します。たとえば、次のように使用します。 $Date$ 必要になるだろう git checkout ブランチを切り替えるときにツリー内のすべてのファイルをタッチします。Linux カーネルのサイズのリポジトリの場合、これによりすべてがきしむ音で停止します。

一般に、少なくとも 1 つのバージョンにタグを付けることが最善の策です。

$ git tag v0.5.whatever

...そして、Makefile から次のコマンドを呼び出します。

$ git describe --tags
v0.5.15.1-6-g61cde1d

ここで、git は、v0.5.15.1 以降の匿名バージョン 6 コミットに取り組んでおり、SHA1 ハッシュが次で始まることを示しています。 g61cde1d. 。このコマンドの出力を *.h ファイルをどこかに保存しておけば、あなたはビジネスをしていて、リリースされたソフトウェアをソース コードにリンクすることに問題はありません。これは物事を行うための好ましい方法です。

RCS キーワードの使用を避けられない場合は、これから始めるとよいでしょう。 Lars Hjemliによる説明. 。基本的に、 $Id$ とても簡単です。 git archive, 、も使用できます $Format$.

ただし、RCS キーワードを絶対に避けられない場合は、次のことから始めてください。

git config filter.rcs-keyword.clean 'perl -pe "s/\\\$Date[^\\\$]*\\\$/\\\$Date\\\$/"'
git config filter.rcs-keyword.smudge 'perl -pe "s/\\\$Date[^\\\$]*\\\$/\\\$Date: `date`\\\$/"'

echo '$Date$' > test.html
echo 'test.html filter=rcs-keyword' >> .gitattributes
git add test.html .gitattributes
git commit -m "Experimental RCS keyword support for git"

rm test.html
git checkout test.html
cat test.html

私のシステムでは次のようになります。

$Date: Tue Sep 16 10:15:02 EDT 2008$

シェルエスケープを取得するのに問題がある場合は、 smudge そして clean コマンドを機能させるには、RCS キーワードをそれぞれ展開および削除するための独自の Perl スクリプトを作成し、それらのスクリプトをフィルターとして使用するだけです。

注意してください。 本当に 絶対に必要な以上のファイルに対してこれを実行することは望ましくありません。そうしないと、git の速度がほとんど失われます。

他のヒント

残念ながら、RCSキーワード代替はこれを破ります。たとえば、$ date $を使用するには、Branchを切り替えるときにツリー内のすべてのファイルにタッチするためにGitチェックアウトが必要です。

それは真実ではありません。$日付$などチェックイン時に保持される値に展開されます。とにかくその方がはるかに便利です。したがって、ファイルが実際に再チェックインされない限り、他のリビジョンやブランチでは変更されません。RCS マニュアルより:

   $Date$ The  date  and  time the revision was checked in.  With -zzone a
          numeric time zone offset is appended;  otherwise,  the  date  is
          UTC.

これは、rcs-keyword.smudge フィルターを使用した上記の提案された回答が間違っていることも意味します。チェックアウトの時刻/日付、またはチェックアウトを実行する原因となったものが挿入されます。

以下は、Git プロジェクトに RCS キーワード サポートを追加するために必要な設定とフィルター コードを含むサンプル プロジェクトです。

https://github.com/turon/git-rcs-keywords

セットアップは思ったほど簡単ではありませんが、うまく機能しているようです。Perlで書かれたsmudge/cleanフィルターペアを使用しており(emkの回答で説明されているものと同様)、はい、.gitattributesで設定された拡張子を持つすべてのファイルに影響を与えるため、一般に処理が少し遅くなります。

ファイルに ident 属性を設定することもできますが、次のような文字列が生成されます。

$Id: deadbeefdeadbeefdeadbeefdeadbeefdeadbeef$

どこ deadbeef... は、そのファイルに対応する BLOB の sha1 です。そのキーワード拡張が本当に必要で、(エクスポートされたアーカイブではなく) git リポジトリに必要な場合は、次のようにする必要があると思います。 ident gitattribute に展開を行うカスタム スクリプトを追加します。フックのみを使用する場合の問題は、作業ツリー内のファイルがインデックスと一致せず、git がファイルが変更されたと認識してしまうことです。

ライセンス: CC-BY-SA帰属
所属していません StackOverflow
scroll top