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

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

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

40 cvs
7.08.2008 18:05:28
да, и SVN, и git заметно проще рекурсивно, включая каталоги.
dokaspar 19.07.2012 07:13:24
14 ОТВЕТОВ
РЕШЕНИЕ

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

find . -type f -print0| xargs -0 cvs add
10
7.08.2008 20:22:32
На самом деле вам нужно убедиться, что вы не добавляете каталоги с именем 'CVS' в cvs, по какой-то причине cvs иногда это ловит, иногда нет. Запустите это вместо: найти. \! -имя "CVS" -и \! -Имя "Записи" -и \! -Имя "Хранилище" -и \! имя "Root" -ty
Chris Bunch 11.09.2008 10:47:04
Хотя это хорошее начало, для полного его использования нужно много исключений.
awm 30.04.2012 15:01:53

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

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

-2
14.05.2016 06:02:07

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

find . -type f | xargs cvs add
1
7.08.2008 18:25:47

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

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

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

find . -type f -exec cvs add {} \;
0
23.05.2017 10:29:54

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

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

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

find . -type f -print0| xargs -0 cvs add
1
29.08.2008 18:06:37

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

2
29.08.2008 21:28:58

Обратите внимание, что вы можете использовать только те 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.

2
6.11.2008 10:38:05

Я использую этот простой сценарий оболочки, который должен быть запущен из уже извлеченного каталога 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"
1
30.12.2009 11:39:53

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

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

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

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

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

6
22.08.2014 13:56:51
Не исключает файлы в папках CVS.
Jay Elston 15.02.2018 01:14:50

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

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

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

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

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

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

73
1.03.2011 17:31:37
Я использовал его в иерархии каталогов с сотнями каталогов и тысячами файлов, работая как шарм. Спасибо!
Igor Oks 14.09.2011 12:35:28
cvs просто прост в использовании для простого и простого или резервного копирования для одного или двух человек для управления исходным кодом «резервного копирования» и «
awm 30.04.2012 15:03:19

мне нравится делать (как каталог нужно добавить в)

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

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

0
18.07.2013 10:20:08

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

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

Сначала рекурсивно добавьте все каталоги, кроме 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 '{}' \; \)
9
17.07.2014 08:21:44
На Mac: найти. (-type d -name CVS -prune) -o (-type f! -name '.DS_Store' -exec cvs add '{}' \;)
sgarbesi 13.11.2014 14:32:50
Очень полезные команды, но в каком случае CVS-коммит требуется рекурсивно, так как "cvs commit" будет фиксировать все файлы?
Gagan 19.01.2018 09:03:44
Я использовал его, когда мне нужно было загрузить существующий проект в хранилище
manufosela 12.02.2018 06:23:39

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

  1. Добавьте папку самого высокого уровня с именем NEW_FOLDER
резюме добавить 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
7.06.2016 14:53:29