5

会社で CVS から Git への移行を計画していますが、特定のエンジニアは、$Id: $. ident設定を使用してこれを実装することについてすべて読んだことがありますが.gitattributes、それが望ましくない理由を理解していますが、小さなソースツリーでは可能かもしれません。(うちのソースは膨大なので無理だと思います。)

当社のエンジニアは、ファイルに SHA1 ハッシュが含まれていることを特に気にしません。彼らは知りたいだけです:

  1. 最終変更日
  2. コミッターの名前
  3. おそらくコミットメッセージ

彼らは、コードを参照するときにファイル ヘッダーでこの情報を確認できると非常に便利だと考えており、私はそれについて議論することはできません。

私が知りたいのは:

git commit の前に、ステージングされたすべてのファイルに情報スタンプを付ける方法はありますか? $Id: $つまり、コミットされているファイルの作業コピーに対して、必要な情報のブロックに置き換えられる perl コマンドを実行するには?

.gitattributesこれには、何のアクションも必要ありません。Git は、このような 2 つの情報ブロックをマージする方法を知っているだけでよく、理想的には後者を選択します。スタンプされた情報は、新しく作成されたバージョンでの 1 つのファイル変更にすぎません。

私は pre-commit フックでこれを行うことを見ましたが、意図が異なっているようです-ファイルを編集するためではなく、ファイルをチェックするためだけです。私はそれについて正しいですか?

そして、誰もこのアプローチを試していませんか? git がバージョンを変更するたびにすべてのソース ファイルをフィルタリングしようとするよりも簡単に思えます.gitattributes

アドバイス/警告/ポインターに感謝します。

4

3 に答える 3

3

git ドキュメントキーワード展開セクションでは、きれいなキーワード展開を作成する方法について説明しています。

あなたが望むものを展開するためのRubyスクリプトは、このようなものになります(テストされていません)

#! /usr/bin/env ruby
data = STDIN.read
last_info = `git log --pretty=format:"%ad %cn %s" -1`
puts data.gsub('$Last$', '$Last: ' + last_info.to_s + '$')

フィルタの設定

$ git config filter.last_expander.smudge expand_last_info
$ git config filter.last_expander.clean 'perl -pe "s/\\\$Last[^\\\$]*\\\$/\\\$Last\\\$/"'

.gitattributes のセットアップ

echo '*.txt filter=last_expander' >> .gitattributes

注: (vonbrand が言うように) これがあなたに与えるもの、そしておそらくあなたが望むものは、チェックアウト時のフィールド拡張とコミット時のフィールドの削除です。ただし、結果として、エンジニアは作業ディレクトリ内のチェックアウトされたファイルのフィールドを読み取ることができます。それは彼らが望んでいることではありませんか?これにより、実際にバージョン管理されたコンテンツが冗長なメタデータで台無しになることはありません。

于 2013-03-15T01:24:02.833 に答える
3

RCS (および CVS) はcheckout$Id:$で展開などを行いますが、それらは保存されたファイルには含まれません。誰かがやって来て、 version の名前を plainに変更する可能性があります。誰かがどこから来たのか知りたい場合は、RCS が提供できるよりも詳細に、うまく答えてください。また、これはローカル コマンドであり、CVS サーバーへのトリップはありません (したがって、どこにいても瞬時に利用できます)。1.8.2-rc101.8.2filegit log filegit

于 2013-03-14T20:57:56.043 に答える
0

これを解決する方法は次のとおりです。

  1. 次の pre-commit フックを追加します。

    #!/bin/sh
    git diff --cached --name-only -z --diff-filter=ACM |
            xargs -r0 .filters/keywords --
    git diff --cached --name-only -z --diff-filter=ACM |
            xargs -r0 git add -u -v --
    
  2. 次の commit-msg フックを追加します。

    #!/bin/sh
    awk '!/^[[:space:]]*(#|$)/{exit f++}END{exit !f}' "$1" && exit
    # NOTREACHED unless commit was aborted
    git diff --cached --name-only -z --diff-filter=ACM |
            xargs -r0 .filters/keywords -d --
    git diff --cached --name-only -z --diff-filter=ACM |
            xargs -r0 git add -u -v --
    
  3. 「.filters/fraubsd-keywords」をダウンロードしますが、ファイル名を「keywords」に変更します。

    https://raw.githubusercontent.com/freebsdfrau/FrauBSD/master/.filters/fraubsd-keywords

  4. 「キーワード」を編集し、上部の CONFIGURATION セクションを変更します。

    • FrauBSD からヘッダーへ
    • _FrauBSD から _Header

git commitその後、テキストを実行するたびに、$Header$および/または$Header: ... $翻訳されます$Header: file YYYY-MM-DD HH:MM:SS GMTOFFSET committer $

注: 多かれ少なかれ種類のファイルを操作するには、「キーワード」スクリプトの小さなセクションを変更する必要がある場合があります。これを書いている時点では、「ASCII テキスト」または「シェル スクリプト」であるファイルに対してのみ動作します。

于 2015-10-22T01:49:27.250 に答える