43

私は最近、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 プロパティを無視します」

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

4

4 に答える 4

42

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

残念ながら、RCSキーワード置換はこれを破ります。たとえば、を使用すると、ブランチを切り替えるときにツリー内のすべてのファイルにアクセス$Date$する必要があります。git checkoutLinuxカーネルのサイズのリポジトリの場合、これによりすべてがひどく停止します。

一般に、最善の策は、少なくとも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キーワードの使用を避けられない場合は、LarsHjemliによるこの説明から始めることをお勧めします。基本的に$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およびコマンドでシェルエスケープを機能させるのに問題がある場合は、cleanRCSキーワードをそれぞれ展開および削除するための独自のPerlスクリプトを作成し、それらのスクリプトをフィルターとして使用してください。

絶対に必要な数よりも多くのファイルに対してこれを実行したくないことに注意してください。そうしないと、gitはほとんどの速度を失います。

于 2008-09-16T14:25:23.437 に答える
24

残念ながら、RCS キーワード置換はこれを破ります。たとえば、 $Date$ を使用すると、ブランチを切り替えるときに git checkout がツリー内のすべてのファイルにアクセスする必要があります。

そうではありません。$Date$ などは、チェックイン時に保持されている値に展開されます。とにかく、それははるかに便利です。そのため、ファイルが実際に再チェックインされない限り、他のリビジョンやブランチでは変更されません。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 フィルターを使用した上記の推奨回答が正しくないことも意味します。チェックアウトの時刻/日付、またはそれが実行される原因を挿入します。

于 2009-07-28T14:04:11.107 に答える
6

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

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

セットアップは思ったほど簡単ではありませんが、うまくいくようです。perlで書かれたスマッジ/クリーンフィルターのペアを使用し(emkの回答が説明したものと同様)、はい、.gitattributesに設定された拡張子を持つすべてのファイルに触れ、一般的に少し遅くなります。

于 2011-04-12T09:36:14.330 に答える
1

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

$Id: deadbeefdeadbeefdeadbeefdeadbeefdeadbeef$

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

于 2008-09-15T12:16:30.790 に答える