Как рекурсивно добавлять каталоги CVS
Я немного поиграл с CVS и не очень хорошо знаком со всеми ее возможностями, но меня очень раздражает попытка добавить новые каталоги, которые содержат больше каталогов в них. Запуск " cvs add
" только добавляет содержимое текущего каталога, и использование " cvs import
" тоже не выглядело правильным, поскольку это все еще весь код, который я создаю (это как заявленный импорт для сторонних источников )
Вы, ребята, знаете, как рекурсивно добавить все, что находится в заданном каталоге, в текущий проект CVS (или если SVN или git значительно упрощают это)?
Ответов (14)14
Обратите внимание, что вы можете использовать только cvs add
файлы и папки, которые находятся внутри уже извлеченной рабочей копии, в противном случае вы получите сообщение «Невозможно открыть CVS / Записи для чтения» . Методика создания нового «корневого модуля» с использованием cvs add
объясняется в этом элементе часто задаваемых вопросов WinCVS: http://cvsgui.sourceforge.net/newfaq.htm#add_rootmodule
Если вы работаете в Windows, и TortoiseCVS, и WinCVS поддерживают рекурсивное добавление (и необязательную фиксацию) нескольких файлов за одну операцию. В WinCvs найдите макрос «Добавить»> «Рекурсивное добавление» (автоматическая фиксация) ... В Tortoise используйте команду «Добавить содержимое» для каталога. Оба позволят вам выбрать, какие файлы добавить и какие режимы расширения ключевых слов использовать для них (в основном используются для определения того, какие файлы являются двоичными).
Дополнительную информацию о рекурсивном добавлении в WinCvs смотрите здесь: http://cvsgui.sourceforge.net/newfaq.htm#cvs-add_recursive
Кроме того cvs import
, хорошо подходит для массового пополнения. Однако способ cvs import
, реализованный в оригинальной CVS, имеет два недостатка (поскольку изначально он был написан для стороннего кода):
- он создает обязательную ветвь со специальной семантикой.
- он не создает метаданные репозитория (т. е. скрытые каталоги CVS), необходимые для установки импортированного кода в качестве извлеченной рабочей копии, что означает, что для фактической работы с импортированными файлами вы сначала должны извлечь их из хранилище
Если вы используете CVSNT, вы можете избежать обоих недостатков, указав -nC
опцию импорта. -n
предназначен для избегания ветки "vendor" и -C
для создания каталогов CVS.
Уже обсуждаемые методы будут выполнять рекурсивный поиск, но он не удастся, если вы снова выполните то же действие (если вы хотите добавить поддерево к существующему дереву). По этой причине вам необходимо проверить, что ваши каталоги еще не были добавлены, а затем добавить только файлы, которые не добавлено еще. Для этого мы используем вывод, 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:
$> find . -type d \! -name CVS -exec cvs add '{}' \;
Во-вторых, добавьте все файлы, кроме каталогов CVS:
найти . \ (-type d -name CVS -prune \) -o \ (-type f -exec cvs add '{}' \; \)
В-третьих, сделайте «фиксацию» рекурсивно, как комментарий «первой версии»:
найти . \ (-type d -name CVS -prune \) -o \ (-type f -exec cvs commit -m "первая версия" '{}' \; \)
Последняя пометка всех рекурсивно:
найти . \ (-type d -name CVS -prune \) -o \ (-type f -exec cvs tag -F MY_CVS_TAG '{}' \; \)
Этот ответ от Марка был полезен (find. -Type f -print0 | xargs -0 cvs add), но я решил некоторую проблему, которая возникла, когда cvs add пытается добавить свои собственные файлы, такие как Tag, Entries и т. Д.
- Добавьте папку самого высокого уровня под названием NEW_FOLDER
cvs добавить NEW_FOLDER
- Используйте предыдущую команду с некоторым исключением, чтобы добавить дерево всех подпапок.
найдите NEW_FOLDER / -type d! -название "CVS" -и! -название "Тег" -и! -name "Entries.Log" -и! -название "Записи" -и! -название "Репозиторий" -и! -name "Root" -print0 | xargs -0 cvs добавить
- Используйте предыдущую команду с некоторым исключением, чтобы добавить все файлы
найдите NEW_FOLDER / -type f! -название "CVS" -и! -название "Тег" -и! -name "Entries.Log" -и! -название "Записи" -и! -название "Репозиторий" -и! -name "Root" -print0 | xargs -0 cvs добавить
Решение Марка решает проблему с пробелами, но создает эту проблему:
cvs add: невозможно открыть CVS / Записи для чтения: Нет такого файла или каталога
cvs [add aborted]: нет репозитория
Чтобы исправить это, нужно использовать следующую команду:
find . -type f -exec cvs add {} \;
SVN определенно делает эту тривиальную задачу, однако использование графического интерфейса, такого как Tortoise, еще проще.
Это может быть хорошим местом для начала: http://www-mrsrl.stanford.edu/~brian/cvstutorial/
I'm using this simple shell script, which should be started from an already checked-out CVS directory. It will stupidly try to add/commit any files and directories it finds upon its recursive search, so in the end you should end up with a fully commit tree.
Simply save this as something like /usr/bin/cvsadd
and don't forget to 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":
find . -type d \! -name CVS -exec cvs add '{}' \;
Затем добавьте все файлы, за исключением всего, что находится в каталоге CVS:
find . \( -type d -name CVS -prune \) -o \( -type f -exec cvs add '{}' \; \)
Теперь, если у кого-то есть лекарство от смущения использования CVS в наши дни ...