SVN 저장소에 작업 사본의 모든 버전 화되지 않은 파일을 자동으로 'svn add'하는 좋은 방법을 찾고 있습니다.
소스 제어하에 있어야 할 파일을 만들 수있는 라이브 서버가 있습니다. 한 번에 하나씩 추가하고 추가하는 대신 자동으로 추가 할 수있는 짧은 스크립트를 갖고 싶습니다.
내 서버에서 Windows Server 2003을 실행 중이므로 Unix 솔루션이 작동하지 않습니다.
SVN 저장소에 작업 사본의 모든 버전 화되지 않은 파일을 자동으로 'svn add'하는 좋은 방법을 찾고 있습니다.
소스 제어하에 있어야 할 파일을 만들 수있는 라이브 서버가 있습니다. 한 번에 하나씩 추가하고 추가하는 대신 자동으로 추가 할 수있는 짧은 스크립트를 갖고 싶습니다.
내 서버에서 Windows Server 2003을 실행 중이므로 Unix 솔루션이 작동하지 않습니다.
답변:
svn add --force * --auto-props --parents --depth infinity -q
좋은 팁! 한 가지 언급 : 내 Eclipse 는 새 파일을 무시 목록에 자동으로 추가합니다. 구성 문제 일 수 있지만 어쨌든 --no-ignore
도움 이되는 옵션이 있습니다.
이 후에 커밋 할 수 있습니다.
svn commit -m 'Adding a file'
alias magic="svn add --force * --auto-props --parents --depth infinity -q"
-설명 :svn help add
*
마지막 에 입력해야합니다 . 그렇지 않으면 작동하지 않습니다 (임대 할 때)
작동하는 것은 다음과 같습니다.
c:\work\repo1>svn add . --force
하위 디렉토리의 내용을 추가합니다.
무시 된 파일을 추가하지 않습니다.
추가 된 파일을 나열합니다.
명령의 점은 현재 디렉토리를 나타내며, 현재 디렉토리와 다른 디렉토리를 추가하려는 경우 특정 디렉토리 이름 또는 경로로 바꿀 수 있습니다.
.\*
svn root가 다른 dir에 있거나 있어야합니다 stuff\svn_root\*
.
stuff\svn_root
에서 하위 디렉토리 (예 :) 에 파일을 추가하지 않습니다 stuff\svn_root\already_in_svn\not_in_svn.txt
. 따라서 끝에 별.
이것은 나를 위해 일했다 :
svn add `svn status . | grep "^?" | awk '{print $2}'`
( 소스 )
Windows의 문제점을 이미 해결 했으므로 이것은 Sam 솔루션 인 UNIX 솔루션입니다. 제목에 키워드 "WINDOWS"가 포함되어 있지 않기 때문에 같은 질문을하는 사람들에게 여전히 유용하다고 생각하면서 여기에 추가했습니다.
참고 (2015 년 2 월) : "bdrx"로 주석을 달면 위 명령을 다음과 같이 단순화 할 수 있습니다.
svn add `svn status . | awk '/^[?]/{print $2}'`
awk '/^[?]/{print $2}'
; 추가 grep 프로세스가 필요하지 않습니다.
이 방법은 공백의 개수 / 조합이있는 파일 이름을 처리해야합니다.
svn status /home/websites/website1 | grep -Z "^?" | sed s/^?// | sed s/[[:space:]]*// | xargs -i svn add \"{}\"
다음은 해당 명령의 기능에 대한 설명입니다.
공백이있는 파일 이름을 'svn add'로 가져올 수 있도록 xargs에 -i 인수를 사용하십시오. 기본적으로 -i는 {}를 플레이스 홀더로 사용하도록 설정하여 'svn에서 사용하는 파일 이름 주위에 "문자를 넣을 수 있습니다. 더하다'.
이 방법의 장점은 공백이있는 파일 이름을 처리해야한다는 것입니다.
비 명령 행 솔루션을 사용하려는 경우 TortoiseSVN 에는이 기능이 내장되어 있습니다. 최상위 폴더를 마우스 오른쪽 버튼으로 클릭하고 추가 ...를 선택 하십시오 .
이것은 svn book에 설명되어 있으며 가장 간단하며 나에게 완벽하게 작동합니다.
svn add * --force
사용하다:
svn st | grep ? | cut -d? -f2 | xargs svn add
svn status | cut -d ? -f 2 -s | xargs svn add
이 게시물에 Windows 태그가 지정되었으므로 Windows 솔루션을 해결할 것이라고 생각했습니다. 프로세스를 자동화하고 싶었지만 박쥐 파일을 만들었습니다. C #에서 console.exe를 만드는 것을 거부했습니다.
커밋 프로세스를 시작할 때 리포지토리에 추가되지 않은 파일이나 폴더를 추가하고 싶었습니다.
많은 답변의 문제점은 TortoiseSVN의 무시 목록에 따라 무시 해야하는 버전이없는 파일을 나열한다는 것 입니다.
여기 내 후크 설정 및 배치 파일이 있습니다.
거북이 훅 스크립트 :
"start_commit_hook".
(where I checkout) working copy path = C:\Projects
command line: C:\windows\system32\cmd.exe /c C:\Tools\SVN\svnadd.bat
(X) Wait for the script to finish
(X) (Optional) Hide script while running
(X) Always execute the script
svnadd.bat
@echo off
rem Iterates each line result from the command which lists files/folders
rem not added to source control while respecting the ignore list.
FOR /F "delims==" %%G IN ('svn status ^| findstr "^?"') DO call :DoSVNAdd "%%G"
goto end
:DoSVNAdd
set addPath=%1
rem Remove line prefix formatting from svn status command output as well as
rem quotes from the G call (as required for long folder names). Then
rem place quotes back around the path for the SVN add call.
set addPath="%addPath:~9,-1%"
svn add %addPath%
:end
for /f "usebackq tokens=2*" %%i in (`svn status ^| findstr /r "^\?"`) do svn add "%%i %%j"
이 구현에서는 폴더 / 파일 이름에 아래와 같이 둘 이상의 공간이있는 경우 문제가 발생합니다.
"C:\PROJECTS\BACKUP_MGs_via_SVN\TEST-MG-10\data\destinations\Sega Mega 2"
"C:\PROJECTS\BACKUP_MGs_via_SVN\TEST-MG-10\data\destinations\One space"
"C:\PROJECTS\BACKUP_MGs_via_SVN\TEST-MG-10\data\destinations\Double space"
"C:\PROJECTS\BACKUP_MGs_via_SVN\TEST-MG-10\data\destinations\Single"
이러한 경우는 다음과 같이 간단합니다.
for /f "usebackq tokens=1*" %%i in (`svn status ^| findstr /r "^\?"`) do svn add "%%j"
Linux를 사용하거나 Windows에서 Cygwin 또는 MinGW를 사용하는 경우 다음과 같은 bash와 같은 솔루션을 사용할 수 있습니다. 여기에 제시된 다른 유사한 것들과 달리 이것은 파일 이름 공간을 고려합니다.
svn status| grep ^? | while read line ; do svn add "`echo $line|cut --complement -c 1,2`" ;done
파일 중 일부만 재귀 적으로 추가하는 방법을 알아 내려고 시간을 보낸 후 나에게 효과가 있었던 것을 공유하는 것이 타당하다고 생각했습니다.
FOR /F %F IN ('dir /s /b /a:d') DO svn add --depth=empty "%F"
FOR /F %F IN ('dir /s /b /a *.cs *.csproj *.rpt *.xsd *.resx *.ico *.sql') DO svn add "%F"
여기에 몇 가지 설명이 있습니다.
첫 번째 명령은 모든 디렉토리를 추가합니다. 두 번째 명령은 지정된 패턴에 따라 파일 만 추가합니다.
자세한 내용을 알려 드리겠습니다.
두 번째 명령에서 유일한 차이점은 dir 명령과 svn 명령입니다. 충분하다고 생각합니다.
당신은 명령을 사용할 수 있습니다
svn add * force--
또는
svn add <directory/file name>
재귀 추가는 기본 속성 입니다. SVN book 에서 볼 수 있습니다 .
무시 목록 또는 전역 속성에 문제가있을 수 있습니다.
TortoiseSVN > Properties
.svn:global-ignores with a value of *
star(*)
재귀 추가를 무시합니다. 따라서이 속성을 제거하십시오.TortoiseSVN > Settings > General
.star(*)
이 특성을 제거하십시오.이 사람 도 설명했습니다 왜이 속성이 내 프로젝트에 추가되었는지 했습니다.
가장 좋은 방법은 확장명이없는 파일을 마우스 오른쪽 버튼으로 클릭하고 TortoiseSVN-> SVN 무시-> * (재귀 적으로)를 선택한 다음 커밋하는 것입니다.
로그를 확인하여 누가 속성 변경을 커밋했는지 확인하고 실제로 무엇을하려고했는지 알아 내고 나중에 더 조심하도록 요청할 수 있습니다. :)