Сведения о вопросе

DUNKER

16:03, 1st July, 2020

Теги

cvs    

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

Просмотров: 525   Ответов: 14

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

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



  Сведения об ответе

PROGA

18:03, 1st July, 2020

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

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

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

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

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

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


  Сведения об ответе

PIRLO

18:03, 1st July, 2020

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

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


  Сведения об ответе

SSESION

18:03, 1st July, 2020

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

Сначала рекурсивно добавьте все каталоги за вычетом CVS:

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

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

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

В-третьих, сделайте “commit” рекурсивно, как "first version" комментарий:

 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 '{}' \; \)


  Сведения об ответе

$DOLLAR

18:03, 1st July, 2020

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

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

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

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

Работать на меня


  Сведения об ответе

LIZA

18:03, 1st July, 2020

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


  Сведения об ответе

SSESION

18:03, 1st July, 2020

Обратите внимание, что вы можете использовать cvs add только для файлов и папок, которые находятся внутри уже извлеченной рабочей копии, в противном случае вы получите сообщение "Cannot open CVS/Entries for reading" . Способ создания нового "root module" с помощью cvs add описан в этом WinCVS FAQ item: http://cvsgui.sourceforge.net/newfaq.htm#add_rootmodule

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

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


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

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

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


  Сведения об ответе

LIZA

18:03, 1st July, 2020

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

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

найдите NEW_FOLDER/-тип d ! - имя "CVS"-а ! - имя "Tag"-а ! - имя "Entries.Log" - и ! - имя "Entries"-а ! - имя "Repository"-а ! - имя "Root"-print0 | xargs -0 cvs добавить

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

найдите NEW_FOLDER/-тип f ! - имя "CVS"-а ! - имя "Tag"-а ! - имя "Entries.Log" - и ! - имя "Entries"-а ! - имя "Repository"-а ! - имя "Root"-print0 | xargs -0 cvs добавить


  Сведения об ответе

lesha

18:03, 1st July, 2020

Я использую этот простой скрипт shell, который должен быть запущен из уже проверенного каталога 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"


  Сведения об ответе

appple

18:03, 1st July, 2020

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

find . -type f | xargs cvs add


  Сведения об ответе

piter

18:03, 1st July, 2020

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

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

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

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


  Сведения об ответе

qwerty101

18:03, 1st July, 2020

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


  Сведения об ответе

DAAA

18:03, 1st July, 2020

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

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

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

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


  Сведения об ответе

+-*/

18:03, 1st July, 2020

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

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

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


  Сведения об ответе

P_S_S

18:03, 1st July, 2020

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

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


Ответить на вопрос

Чтобы ответить на вопрос вам нужно войти в систему или зарегистрироваться