Удалить пустой каталог из CVS?

Не совсем понимаю, как это произошло, но каким-то образом в моем репозитории оказалась совершенно пустая иерархия каталогов:

com/
com/companyname/
com/companyname/blah/
com/sun/
com/sun/java/
com/sun/java/jax_rpc_ri/

Я думаю, что произошло то, что в этих каталогах действительно были файлы, но затем разработчик понял, что он / она не должны были регистрировать их в первую очередь, поскольку это побочные продукты процесса сборки, поэтому он / она удалил файлы, но почему-то пустые каталоги остаются в хранилище как древние реликвии.

Как я могу удалить это из CVS? Единственные результаты, которые я, кажется, могу найти в Google, говорят о том, что не должно быть необходимости удалять пустые каталоги, поскольку CVS не будет их хранить в первую очередь, и что параметры -P (удалить) для cvs update должны удалить их из рабочего каталога - что не поможет, если в вашем репозитории действительно есть пустые каталоги.

cvs remove и cvs commit, похоже, не заботятся об этой ситуации:

$ cvs remove -Rf com
cvs remove: Removing com
cvs remove: Removing com/companyname
cvs remove: Removing com/companyname/blah
cvs remove: Removing com/sun
cvs remove: Removing com/sun/java
cvs remove: Removing com/sun/java/jax_rpc_ri
$ cvs commit com
cvs commit: Examining com
cvs commit: Examining com/companyname
cvs commit: Examining com/companyname/blah
cvs commit: Examining com/sun
cvs commit: Examining com/sun/java
cvs commit: Examining com/sun/java/jax_rpc_ri
$ ls -l com
total 24
drwxrwxr-x  2 matt matt 4096 Oct 15 14:38 CVS
drwxrwxr-x  9 matt matt 4096 Oct 15 14:38 companyname
drwxrwxr-x  4 matt matt 4096 Oct 15 14:38 sun

Он все еще там!

У SVN тоже такое странное поведение?


cvs
person matt b    schedule 15.10.2008    source источник


Ответы (7)


AFAIK протокол CVS не позволяет удалять каталоги. Вам следует перейти в консоль сервера и удалить их из реального физического репозитория.


http://www.network-theory.co.uk/docs/cvsmanual/Removingdirectories.html

Вы не удаляете сам каталог; нет способа сделать это.

person Jorge Ferreira    schedule 15.10.2008
comment
Предупреждение! Необходимо перейти в реальный физический репозиторий, потому что, как только CVS теряет каталог, он уже никогда не сможет его вернуть. CVS хранит удаленные файлы в специальных папках, называемых Attic. Если вы удалите Attic, эти файлы будут потеряны навсегда. - person Kevin Panko; 19.03.2010
comment
Всегда дважды подумайте, прежде чем делать что-то подобное, но я не вижу в этом никаких проблем: ssh cvsserver:/cvsroot 'tar cvf com.tar com'; scp cvsserver:/cvsroot/com.tar .; cvs add com.tar; cvs ci com.tar; cvs rm -f com.tar; ssh cvsserver:/cvsroot 'rm -rf com.tar com' - person minopret; 30.04.2012

При проверке и обновлении CVS всегда будут проверяться пустые каталоги; именно так устроена CVS. Выполните обновление с помощью "-P" - "prune" - для удаления пустых каталогов:

cvs update -dP

(Добавление "-d" обновит новые каталоги, появившиеся после вашего последнего обновления; в противном случае CVS их проигнорирует.)

person Commodore Jaeger    schedule 15.10.2008
comment
Это удаляет только пустые каталоги из рабочей копии - я хочу удалить их из репозитория. - person matt b; 15.10.2008

Просто сделал

  1. rm -rvf / localCopy / проект / emptyDirectory
  2. редактировать / localCopy / project / CVS / Entries, удалить строку D / emptyDirectory ////, сохранить файл
  3. rmdir -v / CVSROOT / проект / emptyDirectory

чтобы избавиться от emptyDirectory в проекте. Признайте, что возиться с внутренними данными CVS незаконно, но похоже, что это сработало (cvs версии 1.12.13).

person Ljubomir Josifovski    schedule 04.11.2009

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

Рассмотрите возможность перехода на Subversion. cvs2svn отлично справляется с преобразованием репозиториев, включая все ветки и теги. Наборы команд CVS и SVN очень похожи и требуют минимальной настройки. (И чтобы это не превратилось в войну "какой контроль версий следует использовать"), когда вы используете SVN, вы можете перейти к любому количеству более продвинутых систем контроля версий, таких как git или SVK.

person Schwern    schedule 15.10.2008

Это сработало для меня. В основном, когда вы это делаете

rmdir -v / CVSROOT / project / emptyDirectory # Мы удаляем каталог из каталога репозитория CVS.

Если у вас есть доступ к репозиторию для входа на сервер unix, вы можете перейти по пути и удалить каталог или поднять ту же проблему с командой unix.

person Pramod Jaiswal    schedule 08.10.2010

cvs имеет тенденцию работать по двухэтапному подходу в отношении каталогов, поэтому для многих команд cvs есть опция -P «Удалить пустые каталоги».

Когда это произошло, например, хотите переименовать каталог, который я только что добавил, я удаляю каталог, удаляю запись для каталога в файле CVS / Entries, это будет строка, перед которой стоит буква «D».

Работа выполнена.

Если я совершил фиксацию, я убеждаюсь, что моя текущая рабочая область, содержащая пустые каталоги, все проверена. Затем я сдуваю ту часть рабочей области, в которую я добавил каталоги.

Например, в

~/Sandbox/my_project/some_stuff_i_want
~/Sandbox/my_project/empty_dir_1
~/Sandbox/my_project/other_stuff_i_want

Я удостоверяюсь, что в обоих каталогах, содержащих то, что я хочу сохранить, все обновлено. Затем я убираю my_project из своей песочницы.

Затем я удаляю пустые каталоги из самого репозитория.

Возвращение и проверка той же рабочей области, например my_project предоставит мне рабочую область без пустых каталогов.

Или просто оставьте все как есть и используйте параметр -P, чтобы CVS все проверил (или обновил все), а затем удалите пустые каталоги.

HTH

ваше здоровье,

Роб

person Rob Wells    schedule 15.10.2008
comment
Спасибо. Это помогло мне отменить ущерб, нанесенный каким-то иджутом на работе. - person Tanktalus; 23.06.2009

Вы не можете удалить каталог из своей рабочей области, вам нужно удалить его с сервера, на котором хранится фактический репозиторий. но вы можете удалить файлы из каталога с помощью команды cvs remove.

person SteveScm    schedule 27.01.2014