3

私はファイルを CVS に持ってい*.hます。

そこに定義があります:

#define MY_BUILD_TAG       "$Name:   $"

ファイルをチェックインし、カスタム TAG ( cvs tag) でタグ付けします。

cvs checkoutはファイルが最初から属しているモジュールです(-r <my tag>もちろん)

cvs statusファイルに新しいスティッキー タグが正しく表示されます。ただし、"$Name: $"ファイルがチェックアウトされても の値は変わりません。私はそれが私の付箋を反映していると思っていました。

私は何を間違っていますか?:との間のスペースで遊んでみましたが、$2、3、4、1 の場所で無駄になりました。

4

1 に答える 1

2

$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 タグを使用していません。

アップデート :

NameCVS のソースを調べると、キーワードに関する不確実性を示すコメントがいくつかあります。

では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
 */

これは、観察された動作の原因として最も可能性が高いと思います。

于 2013-06-17T16:03:31.300 に答える