Как я возвращаюсь большое изменение в CVS?

Если вы можете получить доступ к глобальным переменным без ключевого слова global, если вы хотите их изменить, вы должны использовать ключевое слово global. Например:

foo = 1
def test():
    foo = 2 # new local foo

def blub():
    global foo
    foo = 3 # changes the value of the global foo

В вашем случае вы просто получаете доступ к списку sub.

28
задан user9876 26 June 2009 в 09:48
поделиться

9 ответов

На самом деле ваш первоначальный подход был очень близок к решению. Проблема в том, что присоединение на основе даты не обрабатывает удаленные файлы и каталоги правильно. Сначала вам нужно установить тег для базы кода, к которой вы хотите присоединиться:

mkdir code_base1 && cd code_base1
cvs co -D "2008-12-30" modulename
cvs tag code_base_2008_12_30

Теперь выполните объединение на основе тегов, вычтя все изменения с настоящего момента до 30 декабря 2008 г .:

cd .. && mkdir code_base2 && cd code_base2
cvs co modulename
cvs update -d -j HEAD -j code_base_2008_12_30  # use -d to resurrect deleted directories

Сравните содержимое code_base1 и code_base2. Они должны быть идентичны, за исключением метаинформации CVS. Наконец, зафиксируйте код, как он был 30 декабря 2008 года, как новый HEAD:

cvs commit -m "Revert all changes this year"

Обратите внимание, что пометка кода, к которому вы хотите присоединиться, подобным образом не будет работать, потому что rtag также не обрабатывает удаленные файлы и каталоги правильно при использовании - D:

cvs rtag -D "2008-12-30" code_base_2008_12_30 modulename
27
ответ дан 28 November 2019 в 03:39
поделиться

Существует несколько проблем с CVS, и Вы поражаете их такой проблемой.

  1. CVS является файловым, никакое понятие changeset или snasphot. Это означает, что изменения, такие как то, которое Вы хотите вернуться, немного трудно обработать. Фиксации являются атомарными в рамках данного каталога, не снаружи.

  2. Каталоги не являются имеющими версию. Это означает, что пустые каталоги будут удалены (если Вы обновите с -P), и что необходимо определить -d для создания их на контроле/обновлении.

Так, для ответа на вопрос даты являются, вероятно, единственным способом иметь дело с тем, потому что Вы не использовали теги для создания версии некоторого бедного человека changeset.

Мой комментарий о резервных копиях - то, что может быть легче восстановить целый repo с резервных копий, чем попытка исправить вещи, в которых CVS не действительно хорош.

я поощрил бы Вас - но это - другой предмет - для изменения управления версиями, как только Вы можете. Доверяйте мне, я имел дело с CVS в течение долгого времени в проект FreeBSD и изучаю очень быстро, как ненавистный CVS... См. здесь для некоторых моих представлений о программном обеспечении управления версиями.

4
ответ дан Keltia 28 November 2019 в 03:39
поделиться

Я полагаю, что Ваша вторая команда должна также быть контролем, а не обновлением. Я не могу выровнять по ширине это с логикой, так как нет никакой логики в мире CVS, но это работало на меня. Попробуйте это:

cvs co -P modulename
cvs co -P -jHEAD -jMAIN:2008-12-30 modulename

, Если Вы возвращаетесь, ответвление кроме ГОЛОВЫ, например, X, передает-rX аргумент в обеих командах:

cvs co -P -rX modulename
cvs co -P -rX -jHEAD -jMAIN:2008-12-30 modulename
2
ответ дан JW. 28 November 2019 в 03:39
поделиться

Мне все еще интересно знать, существует ли более легкий путь. (Должен, конечно, быть более легкий путь). То, что я закончил тем, что делал, было на ПК Linux с помощью удара:

# Get woking copy we're going to change
cd ~/work
rm -rf modulename
cvs up -dP modulename
cd modulename

# Remove all files
find . -name CVS -prune -o -type f -print | xargs cvs rm -f

# Get the old revision
cd ~
mkdir scratch
cd scratch
cvs -q co -D 2008-12-31 modulename
cd modulename

# Copy everything to the working dir and do "cvs add" on it
find . -name CVS -prune -o -type f -print | \
    xargs tar c | \
    (cd ~/work/modulename && tar xv | \
    xargs cvs add)

# Check everything is OK before we commit
cd ~/work/modulename
cvs -nq up

# it gave me an error on readme.txt because I'd deleted and then added it, so:
mv readme.txt x # save good rev
cvs add readme.txt # resurrect the bad rev
mv x readme.txt # clobber file with good rev

# Commit it
cvs commit -m "Revert all changes this year"

# Delete now-empty directories
cvs -q up -dP

# Double-check everything is back how it was
diff -ur -xCVS ~/scratch/modulename ~/work/modulename

Тогда я обнаружил, что были все еще различия - мой коллега добавил имена файлов, содержащие пробелы, которые не были удалены вышеупомянутым процессом. Я должен был удалить тех отдельно. (Я должен был использовать find ... -print0, а не -print и передать -0 аргумент xargs. Я просто не понял, что были файлы с пробелами.)

1
ответ дан user9876 28 November 2019 в 03:39
поделиться

Вы попытались использовать -d опция? (создайте подкаталоги)

, Насколько я могу помнить, это подразумевается для cvs co, но не для cvs up.

0
ответ дан JB. 28 November 2019 в 03:39
поделиться

Большая проблема, не имейте полного ответа, просто подсказка относительно Ваших сценариев для контакта с пробелами в именах файлов.

Вместо

find ... | xargs tar c - | ...

попытка, помещая

find ... | perl -e '@names = <>;' -e 'chomp @names;' -e 'system( "tar", "c", "-", @names);' | ...

тот путь, Ваше создание архива (или подобные операции) не пострадает от пробелов на имена, оболочка argv парсинг пропускается, прежде чем tar называют.

Еще одна вещь, на всякий случай это на самом деле работает: если бы существует CVS к утилите SVN, используйте его (я предполагаю, что такая утилита вытянула бы удаленные файлы из "чердака CVS"), и , если это сохраняет каждый момент вовремя как контрольная точка уровня проекта (так как SVN делает это, в отличие от CVS), используйте SVN для выборки правильного момента вовремя. Партия IFS...

0
ответ дан 28 November 2019 в 03:39
поделиться

Согласно http://www.astro.ku.dk/~aake/MHD/docs/CVS.html , следующее - то, в чем Вы нуждаетесь:

cvs update -D "30 Dec 2008 23:59"
0
ответ дан Colin Ross 28 November 2019 в 03:39
поделиться

Если у Вас есть резервное копирование Вашего репозитория (фактические файлы RCS на сервере, например, на ленте) Вы могли просто восстановить ту папку на сервере CVS к состоянию, которым это было прежде. Не забывайте останавливать сервер CVS прежде, чем делать это (и перезапустить его впоследствии).

0
ответ дан Tim Cooper 28 November 2019 в 03:39
поделиться

Вы можете посмотреть cvsps. Погуглите это.

Кроме того, с quilt (или patchscripts Эндрю Мортона, с которого quilt началось) и cvsps, можно получить очень близкое приближение к изменениям.

см. http: // geocities. com / smcameron / cvs_changesets.html

1
ответ дан 28 November 2019 в 03:39
поделиться
Другие вопросы по тегам:

Похожие вопросы: