Как рекурсивно добавлять каталоги CVS

Я немного поиграл с CVS и не очень хорошо знаком со всеми ее возможностями, но меня очень раздражает попытка добавить новые каталоги, которые содержат больше каталогов в них. Запуск " cvs add " только добавляет содержимое текущего каталога, и использование " cvs import " тоже не выглядело правильным, поскольку это все еще весь код, который я создаю (это как заявленный импорт для сторонних источников )

Вы, ребята, знаете, как рекурсивно добавить все, что находится в заданном каталоге, в текущий проект CVS (или если SVN или git значительно упрощают это)?

Ответов (14)

Решение

Ах, пробелы. Это будет работать с пробелами:

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

cvs import не только для сторонних источников. Фактически, каталоги не контролируются версией CVS, поэтому они не подпадают под действие политик веток. Пока вы импортируете пустые каталоги, это нормально.

Обратите внимание, что вы можете использовать только 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 status 2>/dev/null | awk '{if ($1=="?")system("cvs add "$2)}'

вам может потребоваться запустить это несколько раз (сначала для каталога, затем для его дочерних элементов), пока не будет выхода

Уже обсуждаемые методы будут выполнять рекурсивный поиск, но он не удастся, если вы снова выполните то же действие (если вы хотите добавить поддерево к существующему дереву). По этой причине вам необходимо проверить, что ваши каталоги еще не были добавлены, а затем добавить только файлы, которые не добавлено еще. Для этого мы используем вывод, 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 и т. Д.

  1. Добавьте папку самого высокого уровня под названием NEW_FOLDER
cvs добавить NEW_FOLDER
  1. Используйте предыдущую команду с некоторым исключением, чтобы добавить дерево всех подпапок.

найдите NEW_FOLDER / -type d! -название "CVS" -и! -название "Тег" -и! -name "Entries.Log" -и! -название "Записи" -и! -название "Репозиторий" -и! -name "Root" -print0 | xargs -0 cvs добавить

  1. Используйте предыдущую команду с некоторым исключением, чтобы добавить все файлы

найдите 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/

Я думаю, что это то, что я делал еще во времена 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

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 -print0| xargs -0 cvs add

Затем добавьте все файлы в каталогах в CVS.

find . -type f | grep -v CVS | xargs 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 в наши дни ...