문제
저는 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와 같은 자신의 파일을 추가하려고 시도한 문제를 해결했습니다.
- NEW_FOLDER라는 최상위 폴더를 추가하세요.
cvs add NEW_FOLDER
- 모든 하위 폴더 트리를 추가하려면 일부 제외와 함께 이전 명령을 사용하십시오.
NEW_FOLDER/를 찾으세요. -d를 입력하세요!-이름 "CVS" -그리고 !-name "태그" -그리고 !-name "Entries.Log" -그리고 !-name "항목" -그리고 !-name "저장소" -그리고 !-Name "Root"-Print0 | XARGS -0 CVS 추가
- 모든 파일을 추가하려면 일부 제외와 함께 이전 명령을 사용하십시오.
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/