문제

방법을 안내해 주시겠어요? svnlook 아래에서 작업 중입니다.아래 태그의 커밋을 방지하기 위해 이것을 후크에 포함하고 싶습니다. /tags:

$SVNLOOK changed -t "$TXN" "$REPOS" | grep "^U\W.*\/tags\/" && /bin/echo "Cannot commit to tags!" 1>&2 && exit 1
도움이 되었습니까?

해결책

Subversion 사전 커밋 후크는 다음과 같은 종료 코드를 반환하는 경우 커밋이 진행되도록 허용합니다. 0.그렇지 않으면 사전 커밋 후크가 실패하다 커밋은 처리되지 않습니다.

그만큼 $SVNLOOK changed -t "$TXN" "$REPOS" 의 변경 사항을 표시합니다. $REPOS 에서 일어난 일 $TXN.쉘 변수는 사용자가 설정해야 합니다.당신이 보면 pre-commit Subversion과 함께 제공되는 스크립트를 보면 다음과 같은 내용이 표시됩니다.

$TXN=$1
$REPO=$2

의 출력 svnlook changed 명령은 다음과 같습니다:

$ $SVNLOOK changed -t $TXN $REPOS
A   trunk/vendors/deli/
A   trunk/vendors/deli/chips.txt
A   trunk/vendors/deli/sandwich.txt
A   trunk/vendors/deli/pickle.txt
U   trunk/vendors/baker/bagel.txt
_U  trunk/vendors/baker/croissant.txt
UU  trunk/vendors/baker/pretzel.txt
D   trunk/vendors/baker/baguette.txt

첫 번째 열은 무엇인가가 있었는지 여부입니다. 평가하다, dded, 또는 삭제되었습니다.두 번째 열은 속성을 나타냅니다.

나머지는 작업이 수행된 파일의 이름입니다.당신은 그것을 볼 수 있습니다 baguette.txt 삭제되었으며 해당 속성은 croissant.txt 변경되었지만 파일 자체는 업데이트되지 않았습니다.

누군가가 태그를 변경하려고 했다고 가정해 보겠습니다.의 출력 svnlook changed 다음과 같이 보일 것입니다 :

$SVNLOOK changed -t $TXN $REPOS
U   tags/4.2.1/vendors/baker/bagel.txt

grep 명령은 다음과 같습니다.

grep "^U\W.*\/tags\/" 

이것은 다음으로 시작하는 줄을 찾고 있습니다. ^U 업데이트였다는 뜻이죠.그런 다음 다음으로 시작하는 문자열을 찾습니다. /tags.흠...그게 문제가 될 수도 있어요.출력 결과와 일치하지 않습니다. svnlook changed 명령.

아마도 다음과 같아야 할 것입니다:

grep -q "^U.[[\s+tags/"

이는 다음으로 시작하는 모든 문자열과 일치합니다. U, 아마도 다른 문자가 올 수 있고 그 뒤에 공백이 올 수 있으며 바로 다음 단어가 올 수 있습니다. tags/.

해당 표현식을 확인하고 싶을 수도 있습니다.

그만큼 &&목록 연산자.왼쪽에 표현이 있으면 && 성공적으로 실행됩니다(예:0 종료 코드를 반환함) 오른쪽에 있는 명령문이 실행됩니다.그렇지 않으면 오른쪽 문이 실행되지 않습니다.

따라서 귀하의 경우 grep 누군가가 태그를 업데이트한 것처럼 보이는 패턴과 일치하면 true입니다.오른쪽에 있는 진술서 && 실행됩니다.

따라서,

/bin/echo "Cannot commit to tags!" 1>&2

실행됩니다.이는 Subversion 클라이언트로 전송되는 STDERR로 전송되지만 사전 커밋 후크의 종료 코드가 0인 경우에만 해당됩니다.

따라서 다음 목록 연산자 명령 exit 1 다음과 같은 경우 실행됩니다. /bin/echo 성공했습니다.(그렇지 않을 수도 있지만 일반적으로 그렇습니다).이를 통해 사전 커밋 후크는 0이 아닌 종료 코드로 종료되고 후크는 실패하며 Cannot commit to tags! 사용자가 볼 수 있도록 SVN 클라이언트로 전송됩니다.

이 진술이 이렇게 보일 이유는 세상에 전혀 없습니다.이는 거의 동일하며 이해하기가 더 쉽습니다.

if $SVNLOOK changed -t $TXN $REPOS | grep -q "^U.[[\s+tags/"
then
    /bin/echo "Cannot commit to tags!" 1>&2"
    exit 1
fi
exit 0

결국, 이것을 다음과 같은 쉘 스크립트에 넣어야 합니다. pre-commit 어쨌든 쉘 변수가 있습니다 $SVNLOOK, $REPOS, 그리고 $TXN 어쨌든 설정하세요.

이것이 동일하지 않은 이유는 커밋이 실패하더라도 커밋이 실패하기 때문입니다. /bin/echo 실패합니다.


태그를 제어하기 위한 사전 커밋 후크를 찾고 있다면 다음을 살펴보세요. 내 거.이는 수백 개의 사이트에서 테스트되었으며 저장소에 대한 더 많은 제어권을 제공하고 더 나은 오류 검사를 수행합니다.

이 후크는 제어 파일을 사용하여 저장소에 대한 액세스를 제어합니다.예를 들어 필요한 경우 태그를 직접 변경할 수 있도록 할 수 있습니다.

[file You are allowed to create a new tag, but you may not make any changes to it]
file = /tags/**
access = read-only
users = @ALL

[file You are allowed to create a new tag, but you may not make any changes to it]
file = /tags/
access = add-only
users = @ALL

[file I can modify and delete tags]
file = /tags/**
access = read-write
users = jazzr

후크를 살펴보세요.표준 Perl 5.8.8 설치 이상에서 작동합니다.다른 모듈은 필요하지 않습니다.그러나 Subversion 액세스 제어를 위해 LDAP 또는 Active Directory를 사용하는 경우 Net::LDAP Perl 모듈을 사용하고 액세스 제어를 위해 사전 커밋 후크에서 LDAP 또는 Active Directory 그룹을 사용합니다.

다른 팁

$SVNLOOK changed -t "$TXN" "$REPOS" 변경된 모든 경로를 인쇄합니다.매개변수에 대한 자세한 내용은 여기를 참조하세요.http://svnbook.red-bean.com/en/1.7/svn.ref.svnlook.c.changed.html

다음으로, 변경된 경로 목록이 경로에 "/tags/"가 있는 변경된 항목이 있는지 확인하는 grep으로 파이프됩니다. | grep "^U\W.*\/tags\/".

&&는 쉘의 AND 연산자입니다.grep 명령이 일치하는 항목을 찾으면 이 경우 "TRUE"에 해당하는 상태 코드 0을 반환하고 && 뒤의 명령이 실행되고, 그렇지 않으면 실행되지 않습니다.

&& 다음 부분, /bin/echo "Cannot commit to tags!" 1>&2 echo 명령을 실행하고 1(표준 출력)의 메시지를 표준 오류인 &2에 기록합니다.성공하면 명령이 상태 코드 1로 종료됩니다. exit 1.이렇게 하면 후크 스크립트가 0이 아닌 상태 코드와 함께 반환되고 커밋이 실패하고 사용자에게 "태그에 커밋할 수 없습니다!" 메시지가 반환됩니다.

라이센스 : CC-BY-SA ~와 함께 속성
제휴하지 않습니다 StackOverflow
scroll top