$Name
展開が変更されたからといって、CVS がファイルを更新しないようです。ファイルを作成する必要がある場合は、更新します。
/home/kst/CVS_smov
という名前のモジュールを含む に CVS リポジトリがありますname-test
。このスクリプトは、動作を示しています。最初の 2 つのコマンドを変更して、別の構成でデモを行います。
#!/bin/bash
export CVSROOT=/home/kst/CVS_smov
cd ~/cvs-smov/name-test
echo '$Id:$' > name.txt
echo '$Name:$' >> name.txt
cvs add name.txt
cvs commit -m 'First checkin' name.txt
echo "name.txt:"
cat name.txt
echo ''
cvs tag tag-name name.txt
cd ..
cvs checkout -r tag-name name-test
cd name-test
echo "After cvs checkout -r:"
cat name.txt
echo ''
cd ..
rm -r name-test
cvs checkout -r tag-name name-test
cd name-test
echo "After rm -r and cvs checkout -r:"
cat name.txt
CVS 1.12.13 で得られる出力は次のとおりです。
cvs add: scheduling file `name.txt' for addition
cvs add: use `cvs commit' to add this file permanently
/home/kst/CVS_smov/name-test/name.txt,v <-- name.txt
initial revision: 1.1
name.txt:
$Id: name.txt,v 1.1 2013/06/17 15:56:50 kst Exp $
$Name: $
T name.txt
cvs checkout: Updating name-test
After cvs checkout -r:
$Id: name.txt,v 1.1 2013/06/17 15:56:50 kst Exp $
$Name: $
cvs checkout: Updating name-test
U name-test/name.txt
After rm -r and cvs checkout -r:
$Id: name.txt,v 1.1 2013/06/17 15:56:50 kst Exp $
$Name: tag-name $
要約:ファイルを作成してチェックインした後(タグがないためいいえ)、タグを作成してモジュールをチェックアウトした後(まだ更新されていません)、ディレクトリをnukingしてチェックアウトした
後、ファイルの内容を表示しますもう一度(今は埋められています)。$Name
$Name
$Name
これはおそらく CVS のバグですが、率直に言って、どのように動作するかを確認するのに十分な CVS タグを使用していません。
アップデート :
Name
CVS のソースを調べると、キーワードに関する不確実性を示すコメントがいくつかあります。
ではsrc/rcs.c
、関数RCS_gettag
:
/* We have found a numeric revision for the revision tag.
To support expanding the RCS keyword Name, if
SIMPLE_TAG is not NULL, tell the the caller that this
is a simple tag which co will recognize. FIXME: Are
there other cases in which we should set this? In
particular, what if we expand RCS keywords internally
without calling co? */
ではsrc/rcscmds.c
、関数RCS_exec_rcsdiff
:
/* Historically, `cvs diff' has expanded the $Name keyword to the
empty string when checking out revisions. This is an accident,
but no one has considered the issue thoroughly enough to determine
what the best behavior is. Passing NULL for the `nametag' argument
preserves the existing behavior. */
そしてsrc/update.c
、関数patch_file
:
/* FIXME - Passing vers_ts->tag here is wrong in the least number
* of cases. Since we don't know whether vn_user was checked out
* using a tag, we pass vers_ts->tag, which, assuming the user did
* not specify a new TAG to -r, will be the branch we are on.
*
* The only thing it is used for is to substitute in for the Name
* RCS keyword, so in the error case, the patch fails to apply on
* the client end and we end up resending the whole file.
*
* At least, if we are keeping track of the tag vn_user came from,
* I don't know where yet. -DRP
*/
これは、観察された動作の原因として最も可能性が高いと思います。