40

私は CVS を少しいじったことがあり、そのすべての機能に精通しているわけではありませんが、より多くのディレクトリを含む新しいディレクトリを追加しようとするのは非常に面倒です。" " を実行cvs addすると、現在のディレクトリの内容が追加されるだけであり、" cvs import" を使用しても、それはまだすべて私が作成しているコードであるため、正しいことのようには見えませんでした (このハウツーで主張されているインポートはサード パーティのソース用です) 。

特定のディレクトリ内のすべてのものを現在の CVS プロジェクトに再帰的に追加する方法を知っていますか (または、SVN または git を使用するとこれが非常に簡単になります)。

4

14 に答える 14

74

私はこれがかなり効果的に機能することを発見しました:

まず、すべてのディレクトリを追加しますが、「CVS」という名前は追加しません。

find . -type d \! -name CVS -exec cvs add '{}' \;

次に、CVSディレクトリ内のものを除くすべてのファイルを追加します。

find . \( -type d -name CVS -prune \) -o \( -type f -exec cvs add '{}' \; \)

さて、もし誰かがこの時代にCVSを使うことの恥ずかしさの治療法を持っているなら...

于 2011-03-01T17:31:37.773 に答える
11

ああ、スペース。これはスペースで動作します:

find . -type f -print0| xargs -0 cvs add
于 2008-08-07T20:22:32.807 に答える
6

最初にすべてのディレクトリを CVS に追加します

find . -type d -print0| xargs -0 cvs add

次に、ディレクトリ内のすべてのファイルを CVS に追加します。

find . -type f | grep -v CVS | xargs cvs add

私のために働いた

于 2010-10-05T08:46:33.920 に答える
2

cvs addすでにチェックアウトされている作業コピー内にあるファイルとフォルダーに対してのみ使用できることに注意してください。そうしないと、 「読み取り用に CVS/Entries を開けません」というメッセージが表示されます。を使用して新しい「ルート モジュール」を作成する手法cvs addは、この WinCVS FAQ 項目で説明されています: http://cvsgui.sourceforge.net/newfaq.htm#add_rootmodule

Windows を使用している場合、TortoiseCVS と WinCVS の両方が、1 回の操作で複数のファイルの再帰的な追加 (およびオプションのコミット) をサポートします。WinCvs では、マクロ Add>Recursive Add (auto-commit)... を探します。Tortoise では、ディレクトリで Add Contents コマンドを使用します。両方とも、追加するファイルと、それらに使用するキーワード拡張モードを選択できます (ほとんどの場合、どのファイルがバイナリであるかを定義するために使用されます)。

WinCvs での再帰的な追加の詳細については、http://cvsgui.sourceforge.net/newfaq.htm#cvs-add_recursive を参照してください。


それとは別に、cvs import大量追加に適しています。ただし、cvs importvanilla CVS で実装する方法には 2 つの欠点があります (もともとサードパーティ コード用に作成されたため)

  • 特別なセマンティクスを持つ必須ブランチを作成します。
  • インポートされたコードをチェックアウトされた作業コピーとして確立するために必要なリポジトリ メタデータ (つまり、隠し CVS ディレクトリ) は作成されません。リポジトリ

CVSNT を使用している場合は-nC、インポート時にオプションを指定することで両方の欠点を回避できます。-n「vendor」ブランチを回避するため-Cのもので、CVS ディレクトリを作成するためのものです。

于 2008-11-06T10:38:05.037 に答える
2

マークからのこの回答は役に立ちました (find . -type f -print0| xargs -0 cvs add) が、cvs add がタグ、エントリなどの独自のファイルを追加しようとしたときに発生したいくつかの問題を解決しました。

  1. NEW_FOLDER という最上位のフォルダを追加します
cvs NEW_FOLDER を追加
  1. 前のコマンドを一部除外して使用し、すべてのサブフォルダー ツリーを追加します。

NEW_FOLDER/ -type d を見つけます! -name "CVS" - そして ! -name "Tag" -そして ! -name "Entries.Log" -そして ! -name "Entries" -そして ! - 名前「リポジトリ」 - そして ! -name "ルート" -print0 | xargs -0 cvs 追加

  1. 前のコマンドを一部除外して使用し、すべてのファイルを追加します

NEW_FOLDER を見つける/ -タイプ f ! -name "CVS" - そして ! -name "Tag" -そして ! -name "Entries.Log" -そして ! -name "Entries" -そして ! - 名前「リポジトリ」 - そして ! -name "ルート" -print0 | xargs -0 cvs 追加

于 2016-06-07T09:29:25.550 に答える
2

cvs importサードパーティのソースだけではありません。実際、ディレクトリは CVS によってバージョン管理されていないため、ブランチ ポリシーの対象ではありません。空のディレクトリをインポートする限り、問題ありません。

于 2008-08-29T21:28:58.483 に答える
1

この単純なシェル スクリプトを使用しています。これは、既にチェックアウトされている CVS ディレクトリから開始する必要があります。再帰的な検索で見つかったファイルとディレクトリを愚かにも追加/コミットしようとするため、最終的には完全にコミットされたツリーになるはずです。

これを次のよう/usr/bin/cvsaddに保存するだけで、忘れないでくださいchmod +x /usr/bin/cvsadd

#!/ビン/sh
# @(#) 現在の CVS ディレクトリにファイルとディレクトリを再帰的に追加します
# (c) 2009年ディルク・ヤークトマン

if [ -z "$1" ] ; それから
    echo "使い方: cvsadd 'インポートメッセージ'"
    1番出口
フィ

if [ -d "$2" ] ; それから
    cvs add "$2"
    CD "$2" || 1番出口
フィ

もしも [ !-d CVS ] ; それから
    echo "現在のディレクトリには CVS/ ディレクトリを含める必要があります"
    1番出口
フィ

XARGS="xargs -0 -r -t -L 1"

# 最初に現在のディレクトリにすべてのファイルを追加します
探す 。-maxdepth 1 -type f -print0 | $XARGS cvs 追加
探す 。-maxdepth 1 -type f -print0 | $XARGS cvs ci -m "$1"

# 次に、すべてのディレクトリを追加します
探す 。-maxdepth 1 -type d -not -name CVS -a -not -name . -print0 | $XARGS "$0" "$1"
于 2009-12-30T11:39:53.133 に答える
1

これは私が CVS 時代に行ったことだと思います:

find . -type f | xargs cvs add
于 2008-08-07T18:25:47.470 に答える
1

すでに説明したメソッドは再帰的なルックアップを行いますが、同じアクションを再度実行すると失敗します (既存のツリーにサブツリーを追加する場合)。そのため、ディレクトリがまだ追加されていないことを確認し、追加されていないファイルのみを追加する必要があります。まだ追加されています。これを行うには、 の出力を使用して、cvs upまだ追加されていない要素を確認します。行頭に疑問符が表示されます。

options を使用-0-print0-zZ、ファイル名のスペースを正しく処理するようにします。--no-run-if-emptyまた、何も追加する必要がない場合は実行を避けるために使用します。

CVS_PATTERN=/tmp/cvs_pattern
cvs -z3 -q up | egrep '^\?.*' | sed -e 's/^? //' > $CVS_PATTERN
find . -type d \! -name CVS -print0 | grep -zZf $CVS_PATTERN | xargs -0 --no-run-if-empty cvs add
find . \( -type d  -name CVS -prune \) -o \( -type f  -print0 \) | grep -zZf $CVS_PATTERN | xargs -0 --no-run-if-empty cvs add
cvs commit -m 'commiting tree recursively'

このアプローチにより、このようなエラーを回避できます。

cvs add: cannot add special file `.'; skipping
cvs [add aborted]: there is a version in ./dirname1 already

cvs add: `./dirname2/filename' already exists, with version number 1.1.1.1
于 2014-07-03T07:58:54.657 に答える
1

最初にすべてのディレクトリを CVS に追加します

find . -type d -print0| xargs -0 cvs add

次に、ディレクトリ内のすべてのファイルを CVS に追加します。

find . -type f -print0| xargs -0 cvs add
于 2008-08-29T18:06:37.067 に答える
0

Markのソリューションはスペースの問題を解決しますが、次の問題が発生します。

cvs add:読み取りのためにCVS /エントリを開くことができません:そのようなファイルまたはディレクトリはありません
cvs [追加は中止されました]:リポジトリはありません

これを修正するために使用する実際のコマンドは次のとおりです。

find . -type f -exec cvs add {} \;
于 2008-08-07T21:18:18.933 に答える
-2

SVN は間違いなくこの簡単な作業を行いますが、Tortoise のような GUI を使用するとさらに簡単になります。

これは開始するのに適した場所かもしれません: http://www-mrsrl.stanford.edu/~brian/cvstutorial/

于 2008-08-07T18:08:54.620 に答える