Jak dodawać rekurencyjnie katalogi CVS

Grałem trochę z CVS i nie jestem najbardziej zaznajomiony ze wszystkimi jego możliwościami, ale ogromną irytacją dla mnie jest dodawanie nowych katalogów, które zawierają więcej katalogów w nich. Uruchomienie "cvs add "dodaje tylko zawartość bieżącego katalogu, a użycie" cvs import " również nie wyglądało na właściwe, ponieważ nadal jest to cały kod, który produkuję (ten import HOWTO twierdził, że jest dla 3rd party sources)

Czy znacie jakiś sposób na rekurencyjne dodawanie wszystkiego w Podany katalog do bieżącego projektu CVS (lub jeśli SVN lub git to znacznie ułatwia)?
 37
cvs
Author: AlBlue, 2008-08-07

14 answers

Spacje. Będzie to działać ze spacjami:

find . -type f -print0| xargs -0 cvs add
 10
Author: Mark Harrison,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2008-08-07 20:22:32

Znalazłem, że to działa całkiem skutecznie:

Najpierw dodaj wszystkie katalogi, ale nie wszystkie nazwane "CVS":

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

Następnie dodaj wszystkie pliki, z wyłączeniem czegokolwiek w katalogu CVS:

find . \( -type d -name CVS -prune \) -o \( -type f -exec cvs add '{}' \; \)
Teraz, jeśli ktoś ma lekarstwo na zażenowanie używaniem CVS w dzisiejszych czasach...
 71
Author: Tom,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2011-03-01 17:31:37

Używam tego:

Najpierw dodaj rekurencyjnie wszystkie katalogi, pomniejszone o CVS:

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

Po Drugie dodaj wszystkie pliki, mniej katalogów CVS:

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

Trzeci zrób" commit "rekurencyjnie jak" pierwsza wersja " komentarz:

 find . \( -type d -name CVS -prune \) -o \( -type f -exec cvs commit -m "first version" '{}' \; \)

Ostatnie tagowanie wszystkich rekurencyjnie:

 find . \( -type d -name CVS -prune \) -o \( -type f -exec cvs tag -F MY_CVS_TAG '{}' \; \)
 8
Author: manufosela,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2014-07-17 08:21:44

Najpierw dodaj wszystkie katalogi do CVS

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

Następnie dodaj wszystkie pliki w katalogach do CVS

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

Pracował dla mnie

 5
Author: phoneynk,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2014-08-22 13:56:51

cvs import jest nie tylko dla źródeł zewnętrznych. W rzeczywistości katalogi nie są wersjonowane przez CVS, więc nie podlegają zasadom branch. Tak długo, jak importujesz puste katalogi, jest to w porządku.

 2
Author: Alexander L. Belikoff,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2008-08-29 21:28:58

Zauważ, że możesz używać cvs add tylko na plikach i folderach, które znajdują się wewnątrz już sprawdzonej kopii roboczej, w przeciwnym razie otrzymasz wiadomość "nie można otworzyć CVS/Entries do czytania". Technika tworzenia nowego "modułu głównego" za pomocą cvs add jest wyjaśniona w tym punkcie FAQ WinCVS: http://cvsgui.sourceforge.net/newfaq.htm#add_rootmodule

Jeśli korzystasz z systemu Windows, zarówno TortoiseCVS, jak i WinCVS obsługują rekurencyjne dodawanie (i opcjonalne commity) wielu plików w jednej operacji. W WinCvs poszukaj makra Add>Recursive Add (auto-commit)... W Tortoise użyj polecenia Dodaj zawartość w katalogu. Oba pozwolą Ci wybrać, które Pliki dodać i jakie tryby rozszerzenia słów kluczowych użyć dla nich (najczęściej używane do definiowania, które pliki są binarne).

Więcej informacji na temat rekurencyjnego dodawania w WinCvs znajdziesz tutaj: http://cvsgui.sourceforge.net/newfaq.htm#cvs-add_recursive


Poza tym cvs import doskonale nadaje się do masowe dodatki. Jednak sposób implementacji cvs import w vanilla CVS ma dwie wady (ponieważ był pierwotnie napisany dla kodu stron trzecich):

  • tworzy obowiązkową gałąź ze specjalną semantyką.
  • nie tworzy repozytorium metadanych (tj. ukrytych katalogów CVS) potrzebnych do ustalenia zaimportowanego kodu jako sprawdzonej kopii roboczej, co oznacza, że aby rzeczywiście pracować z zaimportowanymi plikami, musisz najpierw sprawdzić je z repozytorium

Jeśli używasz CVSNT, możesz uniknąć obu wad, podając opcję -nC przy imporcie. {[5] } służy do unikania gałęzi "vendor", a {[6] } do tworzenia katalogów CVS.

 2
Author: Oliver Giesen,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2008-11-06 10:38:05

Ta odpowiedź od marka była przydatna (find . - type f-print0 / xargs -0 CVs add) ale rozwiązałem pewien problem, który wystąpił, gdy CVs add spróbować dodać własne pliki, takie jak Tag, wpisy, ect..

  1. Dodaj folder najwyższego poziomu o nazwie NEW_FOLDER
cvs add NEW_FOLDER
  1. Użyj poprzedniego polecenia z pewnym wykluczeniem, aby dodać drzewo wszystkich podfolderów

Znajdź NEW_FOLDER / - typ d ! - imię " CVS " - i ! / align = "left" / - nazwa " wpisy.Log" - i ! - nazwa "wpisy" - i ! - Nazwa "repozytorium" - i ! -name "Root" - print0 / xargs -0 CVs add

  1. Użyj poprzedniego polecenia z pewnym wykluczeniem, aby dodać wszystkie pliki

Find NEW_FOLDER / - type f ! - imię " CVS " - i ! / align = "left" / - nazwa " wpisy.Log" - i ! - nazwa "wpisy" - i ! - Nazwa "repozytorium" - i ! -name "Root" - print0 / xargs -0 CVs add

 2
Author: TGA,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2016-06-07 14:53:29

Myślę, że to jest to, co zrobiłem w moich CV dni:

find . -type f | xargs cvs add
 1
Author: Mark Harrison,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2008-08-07 18:25:47

Najpierw dodaj wszystkie katalogi do CVS

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

Następnie dodaj wszystkie pliki w katalogach do CVS

find . -type f -print0| xargs -0 cvs add
 1
Author: John Meagher,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2008-08-29 18:06:37

Używam tego prostego skryptu powłoki, który powinien być uruchamiany z już sprawdzonego katalogu CVS. Będzie głupio próbować dodawać / zatwierdzać wszelkie pliki i katalogi, które znajdzie podczas rekurencyjnego wyszukiwania, więc w końcu powinieneś skończyć z pełnym drzewem zatwierdzania.

Po prostu zapisz to jako coś w rodzaju /usr/bin/cvsadd i nie zapomnij 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
Author: doj,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2009-12-30 11:39:53

Już omówione metody wykonają rekurencyjne wyszukiwanie, ale nie powiedzie się, jeśli wykonasz tę samą akcję ponownie (jeśli chcesz dodać poddrzewo do istniejącego drzewa) Z tego powodu musisz sprawdzić, czy Twoje katalogi nie zostały jeszcze dodane, a następnie dodać tylko pliki, które jeszcze nie zostały dodane. W tym celu używamy wyjścia cvs up, aby zobaczyć, które elementy nie zostały jeszcze dodane - its będzie miało znak zapytania na początku linii.

Używamy opcji -0, -print0 i -zZ aby upewnić się, że poprawnie przetwarzamy przestrzenie w nazwy plików. Używamy również --no-run-if-empty, aby uniknąć uruchamiania, jeśli nic nie trzeba dodawać.

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'

Dzięki takiemu podejściu unikniemy takich błędów:

cvs add: cannot add special file `.'; skipping
cvs [add aborted]: there is a version in ./dirname1 already

I

cvs add: `./dirname2/filename' already exists, with version number 1.1.1.1
 1
Author: Broomerr,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2014-07-03 07:58:54

I like to do (as directory ' s need an add to)

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

Może być konieczne uruchomienie tego wiele razy (najpierw dla katalogu, potem dla jego dzieci), dopóki nie ma wyjścia

 0
Author: borrel,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2013-07-18 10:20:08

Rozwiązanie Marka rozwiązuje problem spacji, ale tworzy ten problem:

CVs add: cannot open CVS / Entries for reading: No such file or directory
cvs [ add aborted]: no repozytorium

Aby to naprawić, należy użyć komendy:

find . -type f -exec cvs add {} \;
 0
Author: Chris Bunch,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2017-05-23 10:29:54

SVN zdecydowanie sprawia, że to banalne zadanie, korzystanie z GUI jak żółw jest jeszcze łatwiejsze, jednak.

To może być dobre miejsce na początek: http://www-mrsrl.stanford.edu / ~ brian / cvstutorial /

 0
Author: GateKiller,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2016-05-14 06:02:07