2011-06-14 8 views
2

우리는 최근에 TortoiseSVN 또는 AnkhSVN (SVN 작업 복사본을 전환하는 도중 어느 쪽을 결정할 수 없는지)에 문제가있었습니다. 우리 개발자는 스위치가 불완전하다는 것을 깨닫지 못했고 트렁크로 분기를 다시 병합 할 때까지는 아무 문제가 없었습니다. 트렁크로 변경 사항 중 일부가 이미 트렁크에 위임되었음을 알았고 변경 사항 중 일부는 커밋되었습니다. 지점으로.SVN 작업 복사본의 모든 디렉토리가 동일한 저장소 루트를 가리키고 있다는 것을 어떻게 알 수 있습니까?

다행히이 작업은 실제로 아무런 영향을 미치지 않았지만 향후에 다시 발생할 수 있다는 점을 염려하고 있습니다. 작업 복사본의 하위 디렉터리에있는 저장소를 테스트하려면 신속한 방법이 필요합니다. 이제 리눅스에서는 쉘 스크립트를 매우 빠르게 함께 해킹 해이를 결정할 수 있었지만, 현재 Windows에서 어떻게 찾을 수 있는지 모르겠습니다.

나는 SharpSVN을 사용하여 무언가를 해킹하는 것에 완전히 반대하지 않는다. (그렇다면 내가 공유한다면 안심할 수있다.) 그러나 내가 어떤 것을 지어서 시간을 절약 할 수 있는지 알고 싶다. 저를 위해 TortoiseSVN 또는 AnkhSVN 기능을 사용하십시오. 그 경로와 당신의 repo에서 URL을 표시, 작업 카피에있는 모든 폴더에 대해

gci -Recurse | ?{ $_.psIsContainer -eq $true} | %{svn info $_.fullname} | select-string -Pattern "PATH:|URL:" 

: 당신이 PowerShell을 사용할 수있는 경우

답변

3

은 다음과 같은 것을 사용합니다. 일부 폴더가 분기로 전환 된 경우 해당 URL과 경로를 볼 수 있습니다.

당신은 쉽게 당신의 현재 지점 (또는 트렁크) 버전없는 폴더를 무시

의 외부에있는 유일한 경로와 URL을 인쇄 할 조정할 수 쉽습니다 :

(svn status $_.fullname) -notmatch "\?") 

그래서 전체 일이 될 것이다 :

gci | ?{ $_.psIsContainer -eq $true -and ((svn status $_.fullname) -notmatch "\?")} | %{svn info $_.fullname} | select-string -Pattern "PATH:|URL:" 

당신은 SlikSVN 또는 CollabnetSVN 같은 경로에 명령 줄 SVN 클라이언트가 필요합니다.

+0

거의 대부분이 현재 루트와 디렉토리를 비교하는 방법을 알아 냈을 때 게시물을 편집하고 버전없는 디렉토리는 무시합니다. –

+0

@Raskolnikov가 - 나는 버전없는 폴더를 – manojlds

+0

감사를 필터링 업데이트 한,이 win32svn 작업 있어요 - http://sourceforge.net/projects/win32svn/ –

1

리눅스에서 스크립트를 만들 수 있다면 클라이언트에 cygwin을 설치하여 bash 스크립팅에 액세스 할 수 있습니다. 아니면 그들 자신의 윈도우가 설치되어 있기 때문에 아마도 perl. UnxUtils도 꽤 좋습니다. http://unxutils.sourceforge.net/.

1

@manojlds 대답은 상당히 합리적이지만 내 테스트를 통해 몇 가지 문제가 신속하게 밝혀졌습니다. 첫째, 직접 자식 인 SVN이 아닌 폴더를 적절하게 필터링하는 반면 이 아닌은 손자를 처리합니다. svn status 명령은 "작업 복사본이 아닙니다" 메시지와 같은 항목을 포함합니다. Get-ChildItem은 폴더가 Subversion 폴더가 아니기 때문에 잠수가 멈추지 않는다는 것을 기억하십시오. 사실을 기록하지만 파기를 유지하므로 자손도 처리해야합니다.

다음 무시 항목에 svn info balks 명령 (즉, 폴더의 속성에 svn:ignore) 항의 "버전이 아닌 자원」으로.

마지막으로, 너무 많이를 필터링 할 수 있습니다 : 그것은 물음표로 시작하는 라인을 출력 svn status에 의존 경우에만 지정된 폴더 이 버전없는 사실 경우 (버전없는 나타냄).폴더에 svn status는 그 하위 모든, 있는 경우 하위 항목 A 버전이 폴더 버전없는된다 (파일 또는 폴더)가 포함되어 있기 때문에, svn status는 버전없는 상태 표시-질문을 포함 마크의 원인이 다음에 버전 폴더를 조건부에 의해 잘못 건너 뛴다. 그림의 맨 위 창은 버전없는 자식이 없으면 루트의 두 자식 모두 정상 상태를보고 함을 보여줍니다. 리소스 폴더를 버전없는 자손 (하단 창)으로 추가하면 svn status의 보고서에 버전없는 자식이 포함됩니다.

svn status includes all descendants

더 나은 솔루션을 사용하여 볼 수 있습니다-EnhancedChildItem 가져, 내 API bookshelf에서 내 오픈 소스 CleanCode 라이브러리 (에서 사용할 수있는 cmdlet을, 문서에 대한 PowerShell을 볼륨을 열거 나 다운로드로 이동 코드를 얻기위한 링크). 이 향상된 가져-ChildItem을 이미 버전 파일을 분리하는 방법과 폴더에만 집중하는, 그래서 당신이 작성해야 할 코드가 훨씬 간단합니다 (플러스는 위의 단점으로 고생하지 않음)하는 방법을 알고 :

Get-EnhancedChildItem -Svn -Recurse -ContainersOnly | 
    % {svn info $_.fullname} | 
    select-string -Pattern "^(PATH|URL):" 

–ContainersOnly 옵션은 이전 코드가했던 것처럼, 폴더를 분리하는이 필터를 할 수 있습니다 :

:

filter FilterContainersOnly() 
{ 
    if ($_.PSIsContainer) { $_ } 
} 

–Svn 옵션은 이전 코드의 결함을 수정이 필터를 수

filter FilterSvn() 
{ 
    # Check just the current item (depth => empty); 
    # force it to report even if up-to-date (verbose => true); and 
    # wrap stderr into stdout (2>&1) for the next step. 
    $svnStatus = (svn status --verbose --depth empty $_.fullname 2>&1) 

    # Item is non-Svn with status of "?" (unversioned) or "I" (ignored). 
    # Descendants, which are still traversed, cause "svn status" to fail, 
    # and those of course are also non-Svn. 
    $svnFilter = ($svnStatus -notmatch "^[?I]|is not a working copy") 

    if ($svnFilter) { $_ } 
} 
+0

는 주제의 나이에도 불구하고, 당신의 응답을 주셔서 대단히 감사합니다. 나는 실제로 SVN을 더 이상 사용하지 않는다. (이런 종류의 문제가 발생할 수없는 Mercurial의 달콤한 사이렌 호출에 의해 유혹 당했지만) 당신의 응답은 매우 도움이되는 것처럼 보인다. 다행히도이 문제를 해결하기를 희망하는 다른 사람들에게 도움이되기를 바랍니다. –

관련 문제