문제

저는 CVS를 조금 사용해 보았지만 CVS의 모든 기능에 대해 가장 익숙하지는 않습니다. 그러나 더 많은 디렉토리를 포함하는 새 디렉토리를 추가하려고 하는 것이 저에게 큰 짜증을 냈습니다.달리기 "cvs add"는 현재 디렉터리의 내용만 추가하고 "cvs import" 역시 내가 만들고 있는 코드가 전부이기 때문에 올바른 것 같지는 않았습니다(이 하우투에서 가져오기를 주장하는 것은 제3자 소스)

주어진 디렉토리에 있는 모든 것을 현재 CVS 프로젝트에 재귀적으로 추가하는 방법을 알고 계십니까? (또는 SVN이나 git을 사용하면 이 작업이 훨씬 쉬워집니다.)

도움이 되었습니까?

해결책

아, 공백.이것은 공백에서 작동합니다.

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

다른 팁

나는 이것이 매우 효과적으로 작동한다는 것을 알았습니다.

먼저 모든 디렉터리를 추가하되 "CVS"라는 이름은 추가하지 마세요.

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

그런 다음 CVS 디렉터리의 모든 파일을 제외하고 모든 파일을 추가합니다.

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

이제, 요즘 시대에 CVS를 사용하는 당혹감을 해결하는 방법이 있다면...

나는 이것을 사용합니다 :

먼저 CVS 디렉터리를 제외한 모든 디렉터리를 재귀적으로 추가합니다.

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

두 번째로 CVS 디렉터리를 제외한 모든 파일을 추가합니다.

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

세 번째로 "첫 번째 버전" 주석과 같이 재귀적으로 "커밋"을 수행합니다.

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

먼저 CVS에 모든 디렉토리를 추가하십시오.

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

그런 다음 디렉토리의 모든 파일을 CVS에 추가하십시오.

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

나를 위해 일했습니다

cvs import 타사 소스만을 위한 것이 아닙니다.실제로 디렉터리는 CVS에 의해 버전이 관리되지 않으므로 지점 정책의 적용을 받지 않습니다.빈 디렉토리를 가져오는 한 괜찮습니다.

만 사용할 수 있습니다. cvs add 이미 체크아웃된 작업 복사본 내부에 있는 파일 및 폴더에 대해 그렇지 않으면 "읽기 위해 CVS/항목을 열 수 없습니다" 메시지.다음을 사용하여 새로운 "루트 모듈"을 생성하는 기술 cvs add 이 WinCVS FAQ 항목에 설명되어 있습니다. http://cvsgui.sourceforge.net/newfaq.htm#add_rootmodule

Windows를 사용하는 경우 TortoiseCVS와 WinCVS는 모두 단일 작업으로 여러 파일의 재귀적 추가(및 선택적 커밋)를 지원합니다.WinCvs에서 Add>Recursive Add(auto-commit)... 매크로를 찾습니다.Tortoise에서는 디렉터리에 콘텐츠 추가 명령을 사용합니다.두 가지 모두 추가할 파일과 사용할 키워드 확장 모드를 선택할 수 있습니다(주로 바이너리 파일을 정의하는 데 사용됨).

WinCvs의 재귀 추가에 대한 자세한 내용은 여기를 참조하세요. http://cvsgui.sourceforge.net/newfaq.htm#cvs-add_recursive


그 외에도 cvs import 대량 추가에 적합합니다.그러나 그 방법은 cvs import 바닐라 CVS로 구현되는데 두 가지 단점이 있습니다. ~였다 원래는 타사 코드용으로 작성됨):

  • 특별한 의미를 지닌 필수 분기를 생성합니다.
  • 저장소 메타데이터를 생성하지 않습니다(예:숨겨진 CVS 디렉터리) 가져온 코드를 체크아웃 작업 복사본으로 설정하는 데 필요했습니다. 즉, 가져온 파일을 실제로 사용하려면 먼저 저장소에서 해당 파일을 체크아웃해야 함을 의미합니다.

CVSNT를 사용하는 경우 다음을 지정하여 두 가지 단점을 모두 피할 수 있습니다. -nC 가져오기 옵션. -n "공급업체" 지점을 피하기 위한 것이며 -C CVS 디렉토리를 생성하는 것입니다.

Mark의 이 답변은 유용했습니다(.-type f -print0 | XARGS -0 CVS ADD) 그러나 CVS ADD가 태그, 항목, ect와 같은 자신의 파일을 추가하려고 시도한 문제를 해결했습니다.

  1. NEW_FOLDER라는 최상위 폴더를 추가하세요.
cvs add NEW_FOLDER
  1. 모든 하위 폴더 트리를 추가하려면 일부 제외와 함께 이전 명령을 사용하십시오.

NEW_FOLDER/를 찾으세요. -d를 입력하세요!-이름 "CVS" -그리고 !-name "태그" -그리고 !-name "Entries.Log" -그리고 !-name "항목" -그리고 !-name "저장소" -그리고 !-Name "Root"-Print0 | XARGS -0 CVS 추가

  1. 모든 파일을 추가하려면 일부 제외와 함께 이전 명령을 사용하십시오.

NEW_FOLDER/를 찾으세요. -f를 입력하세요!-이름 "CVS" -그리고 !-name "태그" -그리고 !-name "Entries.Log" -그리고 !-name "항목" -그리고 !-name "저장소" -그리고 !-Name "Root"-Print0 | XARGS -0 CVS 추가

나는 이것이 CVS 시절에 했던 일이라고 생각합니다.

find . -type f | xargs cvs add

먼저 CVS에 모든 디렉토리를 추가하십시오.

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

그런 다음 디렉토리의 모든 파일을 CVS에 추가하십시오.

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

나는 이미 체크아웃된 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"

이미 논의 된 방법은 재귀 조회를 수행하지만 동일한 작업을 다시 수행하면 (존재하는 트리에 하위 트리를 추가하려면) 디렉토리가 아직 추가되지 않았는지 확인한 다음 아닌 파일 만 추가해야합니다. 아직 추가되었습니다.이를 위해 우리는 다음의 출력을 사용합니다. 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

나는하고 싶다 (디렉토리에 추가가 필요하기 때문에)

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

출력이 없을 때까지 이를 여러 번 실행해야 할 수도 있습니다(먼저 디렉터리에 대해, 그 다음 하위에 대해).

마크의 솔루션 공간 문제를 해결하지만 다음 문제가 발생합니다.

이력서 추가:읽기를 위해 CVS/항목을 열 수 없습니다.해당 파일이나 디렉터리가 없습니다.
CVS [중단 된 추가] :저장소 없음

이 문제를 해결하기 위해 사용할 실제 명령은 다음과 같습니다.

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

SVN은 확실히 이 사소한 작업을 수행합니다. 그러나 Tortoise와 같은 GUI를 사용하는 것이 훨씬 더 쉽습니다.

여기에서 시작하는 것이 좋습니다. http://www-mrsrl.stanford.edu/~brian/cvstutorial/

라이센스 : CC-BY-SA ~와 함께 속성
제휴하지 않습니다 StackOverflow
scroll top