2009-06-18 3 views

답변

26

이 후크 중 하나가 그것을하지 않을 경우 내가

http://schacon.github.com/git/githooks.html

은 어쩌면이 하나 깜짝 놀라게 할 것 :

이 후 체크 아웃

이 훅이 때 호출되는 a 작업 트리를 업데이트 한 후에 git-checkout을 실행합니다. 결제가 분기 결제 여부를 나타내는 이전 HEAD의 REF (또는 변경되지 않을 수있다) 새로운 HEAD 의 REF, 및 플래그 (변경 지점 : 후크 세 파라미터 주어진다 , 플래그 = 1) 또는 파일 체크 아웃 ( 인덱스에서 파일 검색, 플래그 = 0). 이 훅은 이 git-checkout의 결과에 영향을 줄 수 없습니다.

23

자식 후크 저장소의 특별한 위치에 배치 스크립트입니다, 그 위치는 다음과 같습니다

.git/후크

스크립트는 모든 종류의 수 있습니다 당신이 할 수있는 bash, python, ruby ​​등의 환경에서 실행하십시오.

체크 아웃 후 실행되는 후크는 post-checkout입니다. 워드 프로세서에서 :

... 후크는 세 개의 매개 변수 ...

주어집니다

예 :

  1. 후크 (스크립트) 만들기 :

    touch .git/hooks/post-checkout 
    chmod u+x .git/hooks/post-checkout 
    
  2. 훅 샘플 내용 :

#!/bin/bash                  

set -e                   

printf '\npost-checkout hook\n\n'             

prevHEAD=$1                  
newHEAD=$2                  
checkoutType=$3                 

[[ $checkoutType == 1 ]] && checkoutType='branch' ||        
          checkoutType='file' ;         

echo 'Checkout type: '$checkoutType            
echo ' prev HEAD: '`git name-rev --name-only $prevHEAD`      
echo '  new HEAD: '`git name-rev --name-only $newHEAD` 

참고 : 첫 번째 줄에있는 오두막은 스크립트의 유형을 나타냅니다.

이 스크립트 (git hook)는 전달 된 세 매개 변수 만 캡처하여 인간 친화적 인 형식으로 인쇄합니다.

+0

(새 HEAD의 reflog를 보는 것 외에) 분기 생성 체크 아웃인지 여부를 알 수 있습니까? – pkoch

+0

전혀 새로운 질문을하는 것이 좋습니다. 그렇게한다면 나에게 링크를 보내면 내가 도울 수 있는지 알게 될 것이다. 해결하려는 문제는 무엇입니까? – givanse

+0

커밋이 여러 분기의 맨 위에 있으면'name-rev'는 알파벳순으로 먼저 나오는 이름 만 제공합니다. 따라서 원래 브랜치의 이름 앞에 알파벳순으로 이름이 붙은 브랜치를 체크 아웃 한 후,'prev HEAD' 라인은 NEW 브랜치의 이름을 줄 것이다. 해결 방법 :'thisBranchName = $ (git rev-parse --abbrev-ref HEAD); $ (git branch --color = never - $ 1 | sed -e '/^..//'포함)의 분기 용; [ "$ (git show-ref -s $ branch)"== $ 1] && [ "$ branch"! = "$ thisBranchName"] 인 경우 을 수행하십시오. then parentBranchName = $ branch; 휴식; fi; done' – Ansa211

1

post-checkouthook는 세 개의 매개 변수를받습니다

  1. 참조 이전 HEAD의를
  2. 새로운 HEAD의
  3. 심판이 파일 체크 아웃 (0) 또는 지부 체크 아웃 (1)
을 여부
  • 현재 머리글에서 생성 된 분기가 매개 변수 1과 2에 대해 동일한 값을 갖게된다는 사실을 사용할 수 있습니다.

    cat > .git/hooks/post-checkout <<"EOF" 
    if [ "$3" == "0" ]; then exit; fi 
    if [ "$1" == "$2" ]; then 
        echo "New branch created. (Probably)." 
    fi 
    EOF 
    
    chmod u+x .git/hooks/post-checkout 
    

    제한 :

    • 현재 HEAD가 바보 것 같은 머리에 될 일이 기존의 지점을 확인하고 있습니다.
    • 현재 분기에서 이 아닌 새 분기 생성이 검색되지 않습니다.
  • 4

    다른 것과 비슷하지만 분기가 한 번 체크 아웃되었는지 확인합니다.

    #!/bin/bash 
    
    # this is a file checkout – do nothing 
    if [ "$3" == "0" ]; then exit; fi 
    
    BRANCH_NAME=$(git symbolic-ref --short -q HEAD) 
    NUM_CHECKOUTS=`git reflog --date=local | grep -o ${BRANCH_NAME} | wc -l` 
    
    #if the refs of the previous and new heads are the same 
    #AND the number of checkouts equals one, a new branch has been created 
    if [ "$1" == "$2" ] && [ ${NUM_CHECKOUTS} -eq 1 ]; then 
        git push origin ${BRANCH_NAME} 
    fi 
    
    +1

    이것은 올바른 길을 찾았습니다. 덕분에 너무 많이! 체크 아웃을 카운트하기 위해 grep reflog를 사용했기 때문에 이전에 브랜치가 있었고 같은 이름의 브랜치가 새로 만들어지면 그 브랜치가 새 것으로 인식되지 않을 것입니다. 그게 원하는 동작이나 문제에 따라 유스 케이스에 따라 다를 수 있지만 나는 그것을 언급했을 것입니다. – Pwnrar

    관련 문제