2010-07-22 6 views
18

개발자가 루트가 아닌 디렉토리에 svn : mergeinfo를 설정할 수 없도록하는 사전 커밋 훅을 사용하고자합니다. 즉, svn : mergeinfo는 만 "trunk"또는 "branches/branchName"과 같은 디렉토리에 설정할 수 있습니다. 개발자는 때때로 루트의 하위 디렉터리를 병합 대상으로 사용하는 것이 좋지 않다는 것을 "상기시켜야"합니다 (나열된 모범 사례에 따라 here). 누구든지 그런 훅 스크립트가 있거나 어디서 찾을 수 있는지 알고 있습니까? 나는 Windows 환경에 있기 때문에 일괄 처리 나 PowerShell을 사용하는 것이 좋지만 아무것도 도움이 될 것입니다.루트가 아닌 디렉토리에서 svn : mergeinfo를 허용하지 않는 Svn 사전 커밋 훅

+0

엄밀히 호기심 - 당신은 서브 버전 1.5 또는 1.6을 사용하고 있습니까? (나도 svn : mergeinfos의 모든 종류의 디렉토리/파일을 비 루트 디렉토리와의 병합으로 인해 고통 받았다. 그러나 1.5에서) –

+1

우리는 1.6이다. 내가 겪고있는 문제는 svn 클라이언트가 mergeinfo를 설정 한 오래된 1.5 버그 때문이 아닙니다. 대신 사용자가 "trunk/mySubProject"와 같은 루트가 아닌 디렉토리를 병합 대상으로 사용하여 병합을 수행하여 해당 디렉토리에 병합 정보를 설정하는 "사용자 오류"때문입니다. 나는 당신이 알고 있다고 확신하기 때문에, 이후의 합병을 망쳐 놓는다. –

+0

참으로 - 정보 주셔서 감사합니다. 우리는 최근에 1.6에 불과하므로 상황이 어떻게 변했는지 관찰 할 시간이 없었습니다. 그래도 같은 문제를 해결해야합니다. + Favorite –

답변

7

우선, 필자는 작업을 수행하기 위해 perl이나 python을 사용하는 것이 좋습니다. Windows 배치는 많이 필요합니다.

http://svn.apache.org/repos/asf/subversion/trunk/tools/hook-scripts/의 예제 스크립트를 사용할 수 있습니다. 예를 들어, verify-po.py 스크립트는 파일 인코딩을 검사하고 commit-access-control.pl.in은 커밋 권한이 있는지 확인합니다. 스크립트에서 후자의 경우와 마찬가지로 svnlook diff을 사용하여 디렉토리의 속성을 변경하고 정규 표현식을 사용하는 분기 또는 태그인지 여부를 확인하십시오.

업데이트

당신이 찾고있는 것 같다 enforcer pre-commit hook script 발견.

은 무엇이 스크립트가 수행하는 것은 이 진행되는 거래를 슬쩍 svnlook을 사용합니다. 트랜잭션을 통해 이동하면서 후크 집합을 호출하여 저장소 관리자가 이 무엇이되는지 조사하고 이 수용 가능한지 여부를 결정할 수 있습니다. 이 파일에 속성에 추가되는 각 행에 대해 호출 이후

포함 된 여러 가지 방법과 는, 그 (것)들의 사이에서()를 verify_property_line_added.

+0

다른 사람이 무언가를 생각해 낼 수 없다면, 이것이 가장 가능성있는 해결책이 될 것이므로 현상금 수상자가 될 것입니다. – Charles

+0

그건 그렇고, 귀하의 질문 후 나는 svn 후크에 관심을 시작, 일부 (로그 메시지와 커밋을 금지 시작), 그리고 아마 커밋에 대한 검사 속성에 도달합니다 - 그럼 여기에 또 다른 업데이 트를 넣어 것입니다 . – pmod

0

당신이 서버에 CPAN 경우 :

https://github.com/gnustavo/SVN-Hooks/blob/master/examples/check-mergeinfo.pl

그렇지 않은 경우는 (http://comments.gmane.org/gmane.comp.version-control.subversion.user/118969 기준) :

REPOS="$1" 
TXN="$2" 
SVNLOOK=/usr/bin/svnlook 

if !($SVNLOOK log -t "$TXN" "$REPOS" | grep -q '\[override] ';) then 

    # Get list of paths which have changed  
    TXN_PATHS=$($SVNLOOK changed -t "$TXN" "$REPOS") 

    # Filter those which are allowed: /trunk, /branches/*,... 
    TXN_PATHS=$(echo "$TXN_PATHS" | grep -Ev "^....(trunk/|branches/[^/]+/)$") 

    # Iterate over all paths, which are not allowed to have mergeinfo 
    while IFS= read -r TXN_PATH; do 
     ELEM_PATH=$(echo "$TXN_PATH" | cut -c 5-) 

     MERGEINFO=$($SVNLOOK propget "$REPOS" svn:mergeinfo -t "$TXN" "$ELEM_PATH" 2>/dev/null) 
     if [ ! "$MERGEINFO" = "" ]; then 
     echo " Cannot merge into directory that is not trunk or a branch:" >&2; 
     echo " $ELEM_PATH" >&2; 
     echo " Override by using [override]." >&2; 
     exit 1; 
     fi  
    done <<< "$TXN_PATHS" 

    # echo "Merge info check: OK" 
fi 
관련 문제