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

StackOverflow https://stackoverflow.com/questions/5071

  •  08-06-2019
  •  | 
  •  

Вопрос

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

Ребята, знаете ли вы какой-нибудь способ рекурсивно добавить все, что находится в данном каталоге, в текущий проект 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 '{}' \; \)

В-третьих, сделайте “фиксацию” рекурсивно, как комментарий к "первой версии":

 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 add это объясняется в этом разделе часто задаваемых вопросов WinCvs: http://cvsgui.sourceforge.net/newfaq.htm#add_rootmodule

Если вы используете Windows, как TortoiseCVS, так и WinCvs поддерживают рекурсивное добавление (и необязательную фиксацию) нескольких файлов за одну операцию.В WinCvs найдите макрос Add>Рекурсивное добавление (автоматическая фиксация)...В Tortoise используйте команду Добавить содержимое в каталог.Оба позволят вам выбрать, какие файлы добавлять и какие режимы расширения ключевых слов использовать для них (в основном используются для определения того, какие файлы являются двоичными).

Для получения дополнительной информации о рекурсивной надстройке WinCvs смотрите здесь: http://cvsgui.sourceforge.net/newfaq.htm#cvs-add_recursive


Помимо этого cvs import хорошо подходит для добавления в массу.Однако способ cvs import реализовано в vanilla CVS, имеет два недостатка (поскольку оно был изначально написан для стороннего кода):

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

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

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

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

найдите NEW_FOLDER/ -введите d !-назовите "РЕЗЮМЕ" -и !-назовите "Тэг" -и !-назовите "Записи.Журнал" -и !-назовите "Записи" -и !-назовите "Хранилище" -и !-имя "Root" -print0 | xargs -0 добавить cvs

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

найдите NEW_FOLDER/ -введите f !-назовите "РЕЗЮМЕ" -и !-назовите "Тэг" -и !-назовите "Записи.Журнал" -и !-назовите "Записи" -и !-назовите "Хранилище" -и !-имя "Root" -print0 | xargs -0 добавить cvs

Я думаю, это то, чем я занимался в те времена, когда работал в 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)}'

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

Решение Марка устраняет проблему с пробелами, но создает эту проблему:

добавить резюме:не удается открыть резюме/ Записи для чтения:Такого файла или каталога нет
резюме [добавление прервано]:нет хранилища

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

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

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

Возможно, это хорошее место для начала: http://www-mrsrl.stanford.edu /~брайан/cvstutorial/

Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top