質問
私は CVS を少し触ったことがありますが、そのすべての機能に精通しているわけではありませんが、私にとって非常に面倒なのは、さらに多くのディレクトリを含む新しいディレクトリを追加しようとすることです。ランニング "cvs add
" は現在のディレクトリの内容を追加するだけであり、"cvs import
「まだすべて私が生成しているコードなので、正しいことのようには見えませんでした(インポートを主張するこの方法は、 サードパーティのソース)
指定されたディレクトリ内のすべてのものを現在の CVS プロジェクトに再帰的に追加する方法 (または SVN または git を使用するとこれが著しく簡単になる場合) を知っていますか?
解決
ああ、スペースね。これはスペースでも機能します。
find . -type f -print0| xargs -0 cvs add
他のヒント
これは非常に効果的に機能することがわかりました。
まず、すべてのディレクトリを追加しますが、「CVS」という名前は追加しません。
find . -type d \! -name CVS -exec cvs add '{}' \;
次に、CVS ディレクトリ内のファイルを除くすべてのファイルを追加します。
find . \( -type d -name CVS -prune \) -o \( -type f -exec cvs add '{}' \; \)
さて、この時代に CVS を使用する恥ずかしさを解消する方法を持っている人がいるとしたら...
私はこれを使います:
まず、CVS ディレクトリを除くすべてのディレクトリを再帰的に追加します。
$> find . -type d \! -name CVS -exec cvs add '{}' \;
次に、CVS ディレクトリを除いたすべてのファイルを追加します。
find . \( -type d -name CVS -prune \) -o \( -type f -exec cvs add '{}' \; \)
3 番目は、「最初のバージョン」のコメントのように再帰的に「コミット」します。
find . \( -type d -name CVS -prune \) -o \( -type f -exec cvs commit -m "first version" '{}' \; \)
最後のタグ付けはすべて再帰的に行われます。
find . \( -type d -name CVS -prune \) -o \( -type f -exec cvs tag -F MY_CVS_TAG '{}' \; \)
まずすべてのディレクトリを CVS に追加します
find . -type d -print0| xargs -0 cvs add
次に、ディレクトリ内のすべてのファイルを CVS に追加します。
find . -type f | grep -v CVS | xargs cvs add
私のために働きました
cvs import
サードパーティのソースだけを対象としたものではありません。実際、ディレクトリは CVS によってバージョン管理されないため、ブランチ ポリシーの対象にはなりません。空のディレクトリをインポートする限りは問題ありません。
のみ使用できることに注意してください cvs add
すでにチェックアウトされている作業コピー内にあるファイルとフォルダーに対して実行されます。それ以外の場合は、 「CVS/エントリを開いて読み取ることができません」 メッセージ。を使用して新しい「ルートモジュール」を作成する手法 cvs add
については、この WinCVS FAQ 項目で説明されています。 http://cvsgui.sourceforge.net/newfaq.htm#add_rootmodule
Windows を使用している場合、TortoiseCVS と WinCVS はどちらも、1 回の操作で複数のファイルの再帰的追加 (およびオプションのコミット) をサポートしています。WinCvs でマクロ [追加] > [再帰的追加 (自動コミット)] を探します...Tortoise では、ディレクトリに対して [コンテンツの追加] コマンドを使用します。どちらの場合も、追加するファイルとそのファイルに使用するキーワード拡張モードを選択できます (主に、どのファイルがバイナリであるかを定義するために使用されます)。
WinCvs での再帰的追加の詳細については、ここを参照してください。 http://cvsgui.sourceforge.net/newfaq.htm#cvs-add_recursive
それとは別に cvs import
大量添加に適しています。ただし、その方法は、 cvs import
バニラ CVS で実装されているには 2 つの欠点があります ( だった 元々はサードパーティのコード用に書かれたものです):
- 特別なセマンティクスを持つ必須ブランチを作成します。
- リポジトリのメタデータは作成されません(つまり、隠し CVS ディレクトリ) は、インポートされたコードをチェックアウトされた作業コピーとして確立するために必要です。つまり、インポートされたファイルを実際に操作するには、まずリポジトリからチェックアウトする必要があります。
CVSNT を使用している場合は、次のように指定することで両方の欠点を回避できます。 -nC
インポート時のオプション。 -n
「ベンダー」ブランチを回避するためのものであり、 -C
CVS ディレクトリを作成するためのものです。
Mark からのこの回答は役に立ちました ( を見つけてください)。-Type F -print0 | xargs -0 cvs add)しかし、CVSが追加されたときに発生した問題を解決しました。
- NEW_FOLDER という最上位のフォルダーを追加します
cvs add NEW_FOLDER
- 前のコマンドを一部除外して使用して、すべてのサブフォルダー ツリーを追加します。
find NEW_FOLDER/ -type d !-name "CVS" -そして !-name "タグ" -そして !-name "Entries.Log" -そして !-name "エントリ" -そして !-name "リポジトリ" -そして !-name "root" -print0 | xargs -0 cvs add
- 前のコマンドを一部除外して使用して、すべてのファイルを追加します
find NEW_FOLDER/ -type f !-name "CVS" -そして !-name "タグ" -そして !-name "Entries.Log" -そして !-name "エントリ" -そして !-name "リポジトリ" -そして !-name "root" -print0 | xargs -0 cvs add
これは私が CVS 時代にやったことだと思います:
find . -type f | xargs cvs add
まずすべてのディレクトリを CVS に追加します
find . -type d -print0| xargs -0 cvs add
次に、ディレクトリ内のすべてのファイルを CVS に追加します。
find . -type f -print0| xargs -0 cvs add
私はこの単純なシェル スクリプトを使用しています。このスクリプトは、すでにチェックアウトされている CVS ディレクトリから開始する必要があります。再帰的検索で見つかったファイルやディレクトリを愚かにも追加/コミットしようとするため、最終的には完全にコミットされたツリーが得られるはずです。
これを次のように保存するだけです /usr/bin/cvsadd
そして忘れないでください chmod +x /usr/bin/cvsadd
.
#!/bin/sh # @(#) add files and directories recursively to the current CVS directory # (c) 2009 by Dirk Jagdmann if [ -z "$1" ] ; then echo "usage: cvsadd 'import message'" exit 1 fi if [ -d "$2" ] ; then cvs add "$2" cd "$2" || exit 1 fi if [ ! -d CVS ] ; then echo "current directory needs to contain a CVS/ directory" exit 1 fi XARGS="xargs -0 -r -t -L 1" # first add all files in current directory find . -maxdepth 1 -type f -print0 | $XARGS cvs add find . -maxdepth 1 -type f -print0 | $XARGS cvs ci -m "$1" # then add all directories find . -maxdepth 1 -type d -not -name CVS -a -not -name . -print0 | $XARGS "$0" "$1"
すでに議論されている方法は再帰的な検索を行いますが、同じアクションを再度実行すると(存在したツリーにサブツリーを追加する場合)、ディレクトリがまだ追加されていないことを確認する必要があり、そうでないファイルのみを追加する必要があります。まだ追加されています。これを行うには、次の出力を使用します。 cvs up
まだ追加されていない要素を確認するには、行頭に疑問符が付きます。
オプションを使用します -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
私はそうするのが好きです(ディレクトリに追加する必要があるため)
cvs status 2>/dev/null | awk '{if ($1=="?")system("cvs add "$2)}'
出力がなくなるまで、これを複数回(最初にディレクトリに対して、次にその子に対して)実行する必要がある場合があります。
マークの解決策 スペースの問題は解決しますが、次の問題が発生します。
CVS は以下を追加します:読み取りのための履歴書/エントリを開くことができません:そのようなファイル、又はディレクトリはありません
cvs [add aborted]:リポジトリがありません
これを修正するには、実際に使用するコマンドは次のとおりです。
find . -type f -exec cvs add {} \;
SVN を使用すると、この作業は間違いなく簡単になりますが、Tortoise のような GUI を使用するとさらに簡単になります。
ここから始めるのが良いかもしれません: http://www-mrsrl.stanford.edu/~brian/cvstutorial/