Подтвердить что ты не робот

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

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

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

4b9b3361

Ответ 1

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

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

Ответ 2

Я нашел, что это работает довольно эффективно:

Во-первых, добавьте все каталоги, но не любые имена "CVS":

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

Затем добавьте все файлы, исключая все в каталоге CVS:

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

Теперь, если у кого-то есть лекарство от смущения использования CVS в этот день и возраст...

Ответ 3

Я использую это:

Сначала добавьте рекурсивно все каталоги за исключением 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 '{}' \; \)

Ответ 4

Сначала добавьте все каталоги в CVS

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

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

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

Работал для меня

Ответ 5

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

Ответ 6

Обратите внимание, что вы можете использовать только 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 имеет два недостатка (поскольку он был изначально написан для стороннего кода):

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

Если вы используете CVSNT, вы можете избежать обоих недостатков, указав опцию -nC при импорте. -n заключается в том, чтобы избежать ветки "поставщика", а -C - для создания каталогов CVS.

Ответ 7

Сначала добавьте все каталоги в CVS

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

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

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

Ответ 8

Я использую эту простую оболочку 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"

Ответ 9

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

Ответ 10

Этот ответ от Mark был полезен (find -type f -print0 | xargs -0 cvs add), но я решил некоторую проблему, возникшую при добавлении cvs, чтобы добавить свои собственные файлы, такие как Tag, Entries, ect..

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

найти NEW_FOLDER/-тип d! -name "CVS" - и! -name "Tag" - и! -name "Entries.Log" -и! -name "Записи" - и! -name "Репозиторий" - и! -name "Root" -print0 | xargs -0 cvs add

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

найти NEW_FOLDER/-type f! -name "CVS" - и! -name "Tag" - и! -name "Entries.Log" -и! -name "Записи" - и! -name "Репозиторий" - и! -name "Root" -print0 | xargs -0 cvs add

Ответ 11

SVN определенно делает эту тривиальную задачу, однако использование графического интерфейса, такого как Tortoise, еще проще.

Это может быть хорошим началом: http://www-mrsrl.stanford.edu/~brian/cvstutorial/

Ответ 12

Я думаю, что это то, что я сделал в свои дни CVS:

find . -type f | xargs cvs add

Ответ 13

Отметить решение разрешает проблему с пробелами, но вызывает эту проблему:

cvs add: не удается открыть CVS/Записи для чтение: Нет такого файла или каталога
cvs [add aborted]: нет репозитория

Чтобы исправить это, фактическая команда для использования:

find . -type f -exec cvs add {} \;

Ответ 14

Мне нравится делать (поскольку директорию нужно добавить)

cvs status 2>/dev/null | awk '{if ($1=="?")system("cvs add "$2)}'

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