Ответ 1
Ah, пробелы. Это будет работать с пробелами:
find . -type f -print0| xargs -0 cvs add
Я немного играл с CVS и не знаком со всеми его возможностями, но огромное раздражение для меня - это попытка добавить новые каталоги, которые содержат в них больше каталогов. Запуск "cvs add
" добавляет только содержимое текущего каталога, а использование "cvs import
" не похоже на то, что он либо все еще выполняет код, который я создаю (этот заявленный импорт для сторонние источники)
Вы, ребята, знаете какой-либо способ рекурсивно добавить все в данный каталог к текущему проекту CVS (или если SVN или git делает это заметно проще)?
Ah, пробелы. Это будет работать с пробелами:
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 '{}' \; \)
Третий делает "commit" рекурсивно, как комментарий "первая версия":
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
для файлов и папок, которые находятся внутри уже обработанной рабочей копии, иначе вы получите "Can not открыть CVS/Записи для чтения" . Методика создания нового "корневого модуля" с использованием cvs add
объясняется в этом элементе FAQ WinCVS: http://cvsgui.sourceforge.net/newfaq.htm#add_rootmodule
Если вы находитесь в Windows, то TortoiseCVS и WinCVS поддерживают рекурсивное добавление (и необязательную фиксацию) нескольких файлов за одну операцию. В WinCvs найдите макрос Add > Recursive Add (auto-commit)... В Tortoise используйте команду "Добавить содержимое" в каталоге. Оба позволят вам выбрать, какие файлы добавить и какие варианты расширения ключевых слов использовать для них (в основном используется для определения, какие файлы являются двоичными).
Для получения дополнительной информации о рекурсивном добавлении в WinCvs смотрите здесь: http://cvsgui.sourceforge.net/newfaq.htm#cvs-add_recursive
Кроме того, cvs import
хорошо подходит для массовых добавок. Однако способ cvs import
реализован в ваниле. CVS имеет два недостатка (поскольку он был изначально написан для стороннего кода):
Если вы используете CVSNT, вы можете избежать обоих недостатков, указав опцию -nC
при импорте. -n
заключается в том, чтобы избежать ветки "поставщика", а -C
- для создания каталогов CVS.
Сначала добавьте все каталоги в CVS
find . -type d -print0| xargs -0 cvs add
Затем добавьте все файлы в каталоги в CVS
find . -type f -print0| xargs -0 cvs add
Я использую эту простую оболочку script, которую нужно запустить из уже зарегистрированного каталога 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
Этот ответ от Mark был полезен (find -type f -print0 | xargs -0 cvs add), но я решил некоторую проблему, возникшую при добавлении cvs, чтобы добавить свои собственные файлы, такие как Tag, Entries, ect..
cvs add NEW_FOLDER
найти NEW_FOLDER/-тип d! -name "CVS" - и! -name "Tag" - и! -name "Entries.Log" -и! -name "Записи" - и! -name "Репозиторий" - и! -name "Root" -print0 | xargs -0 cvs add
найти NEW_FOLDER/-type f! -name "CVS" - и! -name "Tag" - и! -name "Entries.Log" -и! -name "Записи" - и! -name "Репозиторий" - и! -name "Root" -print0 | xargs -0 cvs add
SVN определенно делает эту тривиальную задачу, однако использование графического интерфейса, такого как Tortoise, еще проще.
Это может быть хорошим началом: http://www-mrsrl.stanford.edu/~brian/cvstutorial/
Я думаю, что это то, что я сделал в свои дни CVS:
find . -type f | xargs cvs add
Отметить решение разрешает проблему с пробелами, но вызывает эту проблему:
cvs add: не удается открыть CVS/Записи для чтение: Нет такого файла или каталога
cvs [add aborted]: нет репозитория
Чтобы исправить это, фактическая команда для использования:
find . -type f -exec cvs add {} \;
Мне нравится делать (поскольку директорию нужно добавить)
cvs status 2>/dev/null | awk '{if ($1=="?")system("cvs add "$2)}'
вам может потребоваться запустить это несколько раз (сначала для каталога, а затем для его дочерних элементов), пока не будет выхода