버전없는 파일을 모두 SVN에 'svn add'하는 방법은 무엇입니까?


177

SVN 저장소에 작업 사본의 모든 버전 화되지 않은 파일을 자동으로 'svn add'하는 좋은 방법을 찾고 있습니다.

소스 제어하에 있어야 할 파일을 만들 수있는 라이브 서버가 있습니다. 한 번에 하나씩 추가하고 추가하는 대신 자동으로 추가 할 수있는 짧은 스크립트를 갖고 싶습니다.

내 서버에서 Windows Server 2003을 실행 중이므로 Unix 솔루션이 작동하지 않습니다.


1
@Saul이 질문은 당신이 연결된 질문보다 분명히 선행하여 어떻게 중복 될 수 있는지 알지 못합니다. 다른 질문이 있으면 중복됩니다.
Neutrino

Cygwin은 옵션입니다. 모든 Windows 환경에서 강력한 bash 성능을 제공합니다. 사소한 문제로 10 년 이상 사용자가되었습니다.
user151841

답변:


346

svn add --force * --auto-props --parents --depth infinity -q

좋은 팁! 한 가지 언급 : 내 Eclipse 는 새 파일을 무시 목록에 자동으로 추가합니다. 구성 문제 일 수 있지만 어쨌든 --no-ignore도움 이되는 옵션이 있습니다.

이 후에 커밋 할 수 있습니다.

svn commit -m 'Adding a file'

14
좋은 팁. svn status를 사용하는 것보다 훨씬 낫습니다. "svn add --force"이면 충분합니다.
이름

1
이것을 단축 매크로로 설정하는 쉬운 방법이 있습니까? 또한이 답변을 업데이트하여 각 비트를 설명 할 수 있습니까?
MrDuk

2
@MrDuk : 단축 : alias magic="svn add --force * --auto-props --parents --depth infinity -q"-설명 :svn help add
Ronan

17
문제는 이것이 무시 된 파일을 올바르게 추가하는 것입니까? 바람직하지 않습니다.
ladieu

1
@Name- *마지막 에 입력해야합니다 . 그렇지 않으면 작동하지 않습니다 (임대 할 때)
vsync

72

이것은 것과 다른 질문 이지만이 질문에 속하는 답변이 있습니다.

svn status | grep '?' | sed 's/^.* /svn add /' | bash

8
이것은 OP가 가지고 있지 않은 UNIX 도구 (grep, sed, bash)를 사용합니다.
Naaff

3
또한 정말로 원한다면 sed를 파고 창에서 grep 할 수 있습니다.
Sam Saffron

1
cygwin 의견에 대한 찬성에 유감스럽게도 의도적이지 않았습니다 (그리고 취소 할 수 없습니다). 사실 나는 cygwin이 Windows에서 얻을 수있는만큼 추악하다고 생각합니다. grep 대신 findstr을 계속 사용할 수 있으며 추가 설치없이 Windows 2000 이상에서 작동합니다.
Joey


2
나는 mbyrne215와 함께 있습니다. 이 답변은 OP 솔루션보다 더 도움이되었으므로 투표하고 있습니다. OS X 10.6.7에서 완벽하게 작동합니다.
Asbjørn Ulsberg

37

작동하는 것은 다음과 같습니다.

c:\work\repo1>svn add . --force

하위 디렉토리의 내용을 추가합니다.

무시 된 파일을 추가하지 않습니다.

추가 된 파일을 나열합니다.

명령의 점은 현재 디렉토리를 나타내며, 현재 디렉토리와 다른 디렉토리를 추가하려는 경우 특정 디렉토리 이름 또는 경로로 바꿀 수 있습니다.


실제로 그것은 .\*svn root가 다른 dir에 있거나 있어야합니다 stuff\svn_root\*.
Nux

나는 따르지 않는다. SVN에 대한 명령은 명령이 실행되는 경로의 컨텍스트에서 실행됩니다. "svn add. \ *"만으로도 재발하지 않고 많은 경고 스팸을 인쇄하여 실제로 추가 된 내용을 볼 수 없습니다. "svn add. \ * --force"는 되풀이되지만 "svn : 건너 뛰는 인수 : E200025 : '. \. svn'은 예약 된 이름으로 끝납니다"를 출력합니다. 그래서 그것은 내 원래 솔루션보다 나빠 보입니다.
Neutrino

SVN ;-)에 전체 C 드라이브가 없을 것이므로 경로를 추가해야한다고 지적했습니다. 그리고 테스트 지정 경로 stuff\svn_root에서 하위 디렉토리 (예 :) 에 파일을 추가하지 않습니다 stuff\svn_root\already_in_svn\not_in_svn.txt. 따라서 끝에 별.
Nux

@Nux 이제 몇 년이 지난 후에야 마침내 내가 무엇을 얻었는지 알 수 있습니다.) 명령에서 점은 현재 디렉토리를 지정하는 경로입니다. 당연히 유효한 대안이 대신 제공 될 수 있습니다.
Neutrino

이것이 정답입니다. 무시 된 파일 추가를 포함하는 솔루션이 어떻게 최상위 위치에 있는지 잘 모르겠습니다. @Neutrino,이 페이지에 더 이상 표시되지 않는 joey에 대한 귀하의 의견을 제거하고, 귀하의 제안으로 무시 된 파일을 추가하지 않도록 강화하는 줄을 추가하십시오
b_levitt

35

이것은 나를 위해 일했다 :

svn add `svn status . | grep "^?" | awk '{print $2}'`

( 소스 )

Windows의 문제점을 이미 해결 했으므로 이것은 Sam 솔루션 인 UNIX 솔루션입니다. 제목에 키워드 "WINDOWS"가 포함되어 있지 않기 때문에 같은 질문을하는 사람들에게 여전히 유용하다고 생각하면서 여기에 추가했습니다.

참고 (2015 년 2 월) : "bdrx"로 주석을 달면 위 명령을 다음과 같이 단순화 할 수 있습니다.

 svn add `svn status . | awk '/^[?]/{print $2}'`

1
멋지고 콤팩트하며 간결하며 확장에 적합합니다. 감사.
Norman H

1
큰. 또한 확장, 삭제 등을 쉽게 수정할 수 있습니다.
Drewid

내가 필요한 것에 완벽합니다. 감사합니다!
Jeff

2
왜 사람들은 항상 grep하고 awk로 파이프합니까? Awk는 패턴 매칭을 할 수 있습니다 : awk '/^[?]/{print $2}'; 추가 grep 프로세스가 필요하지 않습니다.
bdrx

1
@bdrx : grep이 일반적으로 패턴 일치와 관련되어 있기 때문에? 내 개인적인 경우에는 awk보다 grep에 대해 훨씬 더 경험이 있습니다. 나는 당신이 awk에서 그런 일을 할 수 있다는 것을 알지 못했기 때문에 스크립트에서 awk를 더 많이 사용할 것입니다. 감사!
lepe

5
svn add --force .

현재 디렉토리와 모든 버전 하위 디렉토리에 버전없는 파일이 추가됩니다.


5

이 방법은 공백의 개수 / 조합이있는 파일 이름을 처리해야합니다.

svn status /home/websites/website1 | grep -Z "^?" | sed s/^?// | sed s/[[:space:]]*// | xargs -i svn add \"{}\"

다음은 해당 명령의 기능에 대한 설명입니다.

  • 변경된 모든 파일을 나열하십시오.
  • 이 목록을 '?'가있는 행으로 제한하십시오. 처음에는-즉 새로운 파일.
  • '?'를 제거하십시오. 줄의 시작 부분에 문자.
  • 줄의 시작 부분에서 공백을 제거하십시오.
  • 파일 이름을 xargs로 파이프하여 svn add를 여러 번 실행하십시오.

공백이있는 파일 이름을 'svn add'로 가져올 수 있도록 xargs에 -i 인수를 사용하십시오. 기본적으로 -i는 {}를 플레이스 홀더로 사용하도록 설정하여 'svn에서 사용하는 파일 이름 주위에 "문자를 넣을 수 있습니다. 더하다'.

이 방법의 장점은 공백이있는 파일 이름을 처리해야한다는 것입니다.


이것은 Linux 또는 이와 유사한 것으로 가정합니다 (예 : MinGW 또는 Cygwin ). OP는 "내 서버에서 Windows Server 2003을 실행 중이므로 Unix 솔루션이 작동하지 않습니다."라고 말했습니다.
피터 Mortensen

4

비 명령 행 솔루션을 사용하려는 경우 TortoiseSVN 에는이 기능이 내장되어 있습니다. 최상위 폴더를 마우스 오른쪽 버튼으로 클릭하고 추가 ...를 선택 하십시오 .


거대한 저장소 TortoiseSVN이 중단됩니다. 이것은 내가 명령 줄 대안을 찾게 만들었습니다 :-)
Upendra


3

사용하다:

svn st | grep ? | cut -d? -f2 | xargs svn add

1
또는 cut을 사용하여 grep의 작업을 수행 할 수 있습니다. svn status | cut -d ? -f 2 -s | xargs svn add
Eric3

이것은 Linux 또는 이와 유사한 것으로 가정합니다 (예 : MinGW 또는 Cygwin ). OP는 "내 서버에서 Windows Server 2003을 실행 중이므로 Unix 솔루션이 작동하지 않습니다."라고 말했습니다.
Peter Mortensen

3

나는 항상 사용합니다 :

복사 붙여 넣기

svn st | grep "^\?" | awk "{print \$2}" | xargs svn add $1

1
Op 명시는 Unix 솔루션이 그에게 쓸모가 없다고 말합니다.
Neutrino

이것은 Linux 또는 이와 유사한 것으로 가정합니다 (예 : MinGW 또는 Cygwin ). OP는 "내 서버에서 Windows Server 2003을 실행 중이므로 Unix 솔루션이 작동하지 않습니다."라고 말했습니다.
피터 Mortensen

3

이 게시물에 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

2
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"

2

Linux를 사용하거나 Windows에서 Cygwin 또는 MinGW를 사용하는 경우 다음과 같은 bash와 같은 솔루션을 사용할 수 있습니다. 여기에 제시된 다른 유사한 것들과 달리 이것은 파일 이름 공간을 고려합니다.

svn status| grep ^? | while read line ; do  svn add "`echo $line|cut --complement -c 1,2`" ;done

이것은 무엇입니까? CMD? 세게 때리다? Bash (또는 유사한 쉘)처럼 보입니다. 이 경우 Linux 또는 이와 유사한 것으로 가정합니다 (예 : MinGW 또는 Cygwin ). OP는 "내 서버에서 Windows Server 2003을 실행 중이므로 Unix 솔루션이 작동하지 않습니다."라고 말했습니다.
Peter Mortensen

고마워, 당신이 맞아, 내가 Windows에있을 때 나는 Bash와 Cygwin을 사용한다. 그러나 "내 서버에서 Windows Server 2003을 실행 중이므로 Unix 솔루션이 작동하지 않습니다." 거짓입니다. 그는 Cygwin 또는 MinGW를 사용하고 싶지 않지만 그런 식으로 자신을 표현하지 않았습니다. 나는 그 반응을 재구성했다.
ajaest

1

파일 중 일부만 재귀 적으로 추가하는 방법을 알아 내려고 시간을 보낸 후 나에게 효과가 있었던 것을 공유하는 것이 타당하다고 생각했습니다.

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"

여기에 몇 가지 설명이 있습니다.

첫 번째 명령은 모든 디렉토리를 추가합니다. 두 번째 명령은 지정된 패턴에 따라 파일 만 추가합니다.

자세한 내용을 알려 드리겠습니다.

  • FOR : 루프 제어입니다.
  • / F : 파일과 디렉토리를 가져옵니다 (정확하지는 않음).
  • % F : 변수 한 번에 나열된 각 파일의 값을 가정합니다. 다른 한 문자 이름을 가질 수 있습니다.
  • IN : 설명 할 필요 없어요?
  • ( 'dir / s / b / a : d') : 디렉토리를 나열하는 DOS 명령; 필자의 경우 / s는 재귀 적이며 / b는 전체 경로 만 사용하고 / a : d는 디렉토리 만 의미합니다. 괄호와 아포스트로피를 유지하려면 원하는대로 변경하십시오.
  • DO : 명령에서 다음에 오는 것은 각 디렉토리에 대해 실행될 것임을 의미합니다.
  • svn add --depth = empty : 실행할 SVN 코만도입니다. 깊이 정의는 디렉토리 안에있는 파일이 아니라 디렉토리 만 추가하는 것을 의미합니다.
  • "% F": 앞에서 정의한 변수를 사용하는 방법입니다.

두 번째 명령에서 유일한 차이점은 dir 명령과 svn 명령입니다. 충분하다고 생각합니다.


0

당신은 명령을 사용할 수 있습니다

svn add * force--

또는

svn add <directory/file name>

파일 / 디렉토리가 재귀 적으로 추가되지 않는 경우 그런 다음 확인하십시오.

재귀 추가는 기본 속성 입니다. SVN book 에서 볼 수 있습니다 .

무시 목록 또는 전역 속성에 문제가있을 수 있습니다.

솔루션 Google 이슈 트래커가 있습니다.

별표 무시 (*)에 대한 전역 속성 확인

  • 리포 인 창을 마우스 오른쪽 버튼으로 클릭하십시오. 고르다TortoiseSVN > Properties .
  • 당신은 재산이없는 경우 참조 svn:global-ignores with a value of *
  • 속성이 있으면 star(*)재귀 추가를 무시합니다. 따라서이 속성을 제거하십시오.

별 (*) 무시를위한 전역 무시 패턴 확인

  • 리포 인 창을 마우스 오른쪽 버튼으로 클릭하십시오. 고르다TortoiseSVN > Settings > General .
  • 별표 (*)를 설정하지 않은 경우 전역 무시 패턴을 참조하십시오. .
  • 를 찾았 으면 star(*)이 특성을 제거하십시오.

이 사람 도 설명했습니다 왜이 속성이 내 프로젝트에 추가되었는지 했습니다.

가장 좋은 방법은 확장명이없는 파일을 마우스 오른쪽 버튼으로 클릭하고 TortoiseSVN-> SVN 무시-> * (재귀 적으로)를 선택한 다음 커밋하는 것입니다.

로그를 확인하여 누가 속성 변경을 커밋했는지 확인하고 실제로 무엇을하려고했는지 알아 내고 나중에 더 조심하도록 요청할 수 있습니다. :)


0

Linux에서 다음 명령을 입력 할 수 있습니다.

find ./ -name "*." | xargs svn add

0

그가 awk & sed가 표준이 아닌 Windows를 지정했기 때문에 :

for /f "tokens=1*" %e in ('svn status^|findstr "^\?"') do svn add "%f"

또는 배치 파일로 :

for /f "tokens=1*" %%e in ('svn status^|findstr "^\?"') do svn add "%%f"

0

이것은 새 파일을 포함하여 디렉토리를 SVN과 동기화하는 게으르고 위험한 방법입니다.

svn rm --keep-local dir
svn add dir

이것은 꼬집음으로 작동하지만 심각한 결과를 초래할 수 있습니다. 예를 들어 SVN은 종종 파일 기록을 추적하지 못합니다.

디렉토리를 동기화하는 이상적인 방법은 svn 패치를 diff로 사용하고 diff 명령을 사용하는 것이지만, 이것은 diff 명령의 형식에서 벗어나며 svn diff 명령은 파일 시스템 레벨의 차이보다는 작업 디렉토리의 차이를 비교합니다.


-1

나는 비슷한 것을했다고 생각한다.

svn add . --recursive

그러나 내 메모리가 올바른지 확실하지 않습니다 ;-p


2
svn 1.4 및 1.5는 svn add에 대한 매개 변수로
재귀
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.