Я немного поиграл с CVS и не совсем знаком со всеми его возможностями, но меня раздражает попытка добавить новые каталоги, которые содержат больше каталогов в них. Запуск " cvs add
" только добавляет содержимое текущего каталога, а использование " cvs import
" также не выглядело правильным, так как это все еще код, который я создаю (это заявление о том, что импорт предназначен для сторонних источников )
Ребята, знаете ли вы какой-нибудь способ рекурсивного добавления всего в данном каталоге к текущему проекту CVS (или если SVN или git делают это заметно проще)?
Ах, пробелы. Это будет работать с пробелами:
find . -type f -print0| xargs -0 cvs add
SVN определенно делает эту тривиальную задачу, однако использовать GUI, такой как 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
find . -type d -print0| xargs -0 cvs add
Затем добавьте все файлы из каталогов в CVS
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 ищите макрос Add> Recursive Add (auto-commit) ... В Tortoise используйте команду Add Contents для каталога. Оба позволят вам выбрать, какие файлы добавить и какие режимы расширения ключевых слов использовать для них (в основном используется для определения того, какие файлы являются двоичными).
Для получения дополнительной информации о рекурсивном добавлении в WinCvs смотрите здесь: http://cvsgui.sourceforge.net/newfaq.htm#cvs-add_recursive
Помимо этого cvs import
хорошо подходит для массовых дополнений. Однако способ cvs import
реализации в vanilla CVS имеет два недостатка (поскольку изначально был написан для стороннего кода):
- создает обязательную ветку со специальной семантикой.
- он не создает метаданные репозитория (т. е. скрытые каталоги CVS), необходимые для установления импортированного кода в качестве извлеченной рабочей копии, что означает, что для фактической работы с импортированными файлами сначала необходимо извлечь их из хранилище
Если вы используете CVSNT, вы можете избежать обоих недостатков, указав -nC
опцию при импорте. -n
предназначен для избежания ветки "vendor" и -C
для создания каталогов CVS.
Я использую этот простой сценарий оболочки, который должен быть запущен из уже извлеченного каталога CVS. Он будет тупо пытаться добавить / зафиксировать любые файлы и каталоги, которые он найдет при рекурсивном поиске, поэтому в итоге вы должны получить полностью дерево коммитов.
Просто сохраните это как что-то вроде /usr/bin/cvsadd
и не забудьте chmod +x /usr/bin/cvsadd
.
#! / Bin / ш # @ (#) рекурсивно добавлять файлы и каталоги в текущий каталог CVS # (c) 2009 Дирк Ягдманн if [-z "$ 1"]; затем echo "использование: cvsadd 'импортировать сообщение'" выход 1 фи if [-d "$ 2"]; затем резюме добавить "$ 2" CD "$ 2" || выход 1 фи если [ ! -d CVS]; затем echo "текущий каталог должен содержать каталог CVS /" выход 1 фи XARGS = "xargs -0 -r -t -L 1" # сначала добавьте все файлы в текущем каталоге находить . -maxdepth 1 -тип f -print0 | $ XARGS cvs add находить . -maxdepth 1 -тип f -print0 | $ XARGS cvs ci -m "$ 1" # затем добавьте все каталоги находить . -maxdepth 1 -тип d -не -имя CVS -a -не -имя. -принт0 | $ 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 в этот день и возраст ...
мне нравится делать (как каталог нужно добавить в)
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 '{}' \; \)
Этот ответ от Марка был полезен (найти. -Type f -print0 | xargs -0 cvs add), но я решил некоторую проблему, которая возникла, когда cvs add попытался добавить свои собственные файлы, такие как Tag, Entries, ect ..
- Добавьте папку самого высокого уровня с именем NEW_FOLDER
резюме добавить NEW_FOLDER
- Используйте предыдущую команду с некоторым исключением, чтобы добавить все дерево подпапок
найти NEW_FOLDER / -типа d! -имя "CVS" -и! - имя "бирка" - и! - имя "Entries.Log" - и! -Имя "Записи" -и! -Имя "Хранилище" -и! имя "Root" -print0 | xargs -0 резюме добавить
- Используйте предыдущую команду с некоторым исключением, чтобы добавить все файлы
найти NEW_FOLDER / -типа f! -имя "CVS" -и! - имя "бирка" - и! - имя "Entries.Log" - и! -Имя "Записи" -и! -Имя "Хранилище" -и! имя "Root" -print0 | xargs -0 резюме добавить