2009-06-18 29 views

Trả lời

26

Nếu một trong những móc sẽ không làm điều đó tôi sẽ ngạc nhiên trước

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

Có lẽ đây nhất:

hậu kiểm

móc này được gọi khi a git-checkout được chạy sau khi có cập nhật thông tin công việc. Móc là được cung cấp ba tham số: ref của HEAD trước, ref của HEAD mới (có thể hoặc không thay đổi), và cờ cho biết thanh toán là thanh toán chi nhánh (thay đổi nhánh) , cờ = 1) hoặc tệp thanh toán (truy xuất tệp từ chỉ mục , cờ = 0). Móc này không thể ảnh hưởng đến kết quả của git-checkout.

23

Một móc git là một kịch bản được đặt ở một vị trí đặc biệt của kho lưu trữ của bạn, vị trí đó là:

.git/móc

Các kịch bản có thể được bất cứ loại nào mà bạn có thể thực hiện trong môi trường của bạn tức là bash, python, ruby, v.v.

Móc được thực hiện sau khi thanh toán là post-checkout. Từ các tài liệu:

... Các móc được đưa ra ba thông số ...

Ví dụ:

  1. Tạo móc (script):

    touch .git/hooks/post-checkout 
    chmod u+x .git/hooks/post-checkout 
    
  2. Nội dung mẫu móc:

#!/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` 

Lưu ý: Các công việc trong dòng đầu tiên chỉ ra loại kịch bản.

Tập lệnh này (git hook) sẽ chỉ chụp ba thông số được truyền và in chúng theo định dạng thân thiện với con người.

+0

Bạn có biết cách nào để biết đây là thanh toán tạo chi nhánh hay không (bên cạnh việc xem xét bản chỉnh sửa của HEAD mới)? – pkoch

+0

Có vẻ như bạn nên hỏi một câu hỏi hoàn toàn mới. Nếu bạn làm như vậy, hãy gửi cho tôi liên kết và tôi sẽ xem liệu tôi có thể trợ giúp không. Vấn đề mà bạn đang cố gắng giải quyết là gì? – givanse

+0

Nếu một cam kết là đầu của một số chi nhánh, 'name-rev' chỉ cung cấp cho tên mà đến theo thứ tự bảng chữ cái đầu tiên. Vì vậy, sau khi kiểm tra một chi nhánh với một tên theo thứ tự bảng chữ cái đứng trước tên của nhánh ban đầu, dòng 'prev HEAD' sẽ đặt tên cho nhánh mới. Giải pháp thay thế: 'thisBranchName = $ (git rev-parse --abbrev-ref HEAD); cho chi nhánh bằng $ (git branch --color = never --contains $ 1 | sed -e 's /^..//'); làm nếu ["$ (git show-ref -s $ branch)" == $ 1] && ["$ branch"! = "$ thisBranchName"]; sau đó parentBranchName = $ branch; ngắt; fi; done' – Ansa211

1

Các post-checkouthook nhận ba thông số:

  1. Ref của TRỤ trước
  2. Ref của TRỤ mới
  3. Cho dù đây là một kiểm tra tập tin (0) hoặc chi nhánh thanh toán (1)

Bạn có thể sử dụng thực tế rằng một chi nhánh được tạo từ HEAD hiện tại sẽ có cùng giá trị cho các tham số 1 và 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 

Hạn chế:

  • Kiểm tra ra một chi nhánh hiện có mà sẽ xảy ra là tại các HEAD giống như các HEAD hiện tại sẽ đánh lừa nó.
  • Tạo chi nhánh mới không từ HEAD hiện tại sẽ không được phát hiện.
4

Tương tự như những người khác nhưng xác minh rằng chi nhánh đã được kiểm tra một lần.

#!/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

Điều này giúp tôi đi đúng hướng, cảm ơn rất nhiều! Kể từ khi nó rere reflog để đếm checkouts tôi tin rằng một gotcha sẽ là nếu một chi nhánh đã tồn tại trước đó và một chi nhánh mới với cùng tên đã được tạo ra, chi nhánh đó sẽ không được công nhận là mới. Đó có thể là hành vi mong muốn hoặc một vấn đề tùy thuộc vào trường hợp sử dụng nhưng tôi chỉ nghĩ rằng tôi muốn đề cập đến nó. – Pwnrar

Các vấn đề liên quan