Как добавить каталоги CVS рекурсивно - PullRequest
39 голосов
/ 07 августа 2008

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

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

Ответы [ 14 ]

72 голосов
/ 01 марта 2011

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

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

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

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

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

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

10 голосов
/ 08 августа 2008

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

find . -type f -print0| xargs -0 cvs add
8 голосов
/ 17 июля 2014

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

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

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

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

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

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

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

2 голосов
/ 07 июня 2016

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

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

найти NEW_FOLDER / -типа d! -имя "CVS" -и! - имя "бирка" - и! - имя "Entries.Log" - и! -Имя "Записи" -и! - имя "Хранилище" - и! имя "Root" -print0 | xargs -0 резюме добавить

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

найти NEW_FOLDER / -типа f! -имя "CVS" -и! - имя "бирка" - и! - имя "Entries.Log" - и! -Имя "Записи" -и! - имя "Хранилище" - и! имя "Root" -print0 | xargs -0 резюме добавить

2 голосов
/ 06 ноября 2008

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

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

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

2 голосов
/ 30 августа 2008

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

1 голос
/ 03 июля 2014

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

Я использую этот простой сценарий оболочки, который должен запускаться из уже извлеченного каталога 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"
1 голос
/ 29 августа 2008

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

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

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

find . -type f -print0| xargs -0 cvs add
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...