2011-10-09 33 views
5

Tôi vừa bắt đầu viết một ứng dụng web.sử dụng móc git sau khi cam kết

Tôi đang sử dụng GIT để kiểm soát phiên bản và tôi có git và máy chủ web trong cùng một máy tính.

Ứng dụng có 3 môi trường: dev, thử nghiệm và sản xuất

Tôi muốn sử dụng git móc sau mỗi cam kết để cập nhật dev, thử nghiệm hoặc ứng dụng sản xuất.

thực tiễn tốt nhất cho việc này là gì?

tôi cần một cái gì đó như thế này:

  1. khi tôi cam kết, dev phải tự động được cập nhật
  2. khi cam kết thông báo chứa "thử nghiệm:" trước thông điệp - dev và thử nghiệm phải được cập nhật.
  3. khi thư cam kết chứa "sản xuất:" ở phía trước thư - sản xuất, phát triển và thử nghiệm phải được cập nhật.

Cảm ơn!

+4

Chỉ là một gợi ý (vì nó cảm thấy nhất quán hơn và dễ dàng hơn): Sử dụng một _branch_ cho dev, một cho thử nghiệm và một cho sản xuất. Mỗi khi bạn đẩy "test" một hook thì hãy cập nhật env test của bạn (và cứ thế tiếp tục). – KingCrunch

+0

cảm ơn bạn đã chia sẻ đề xuất của bạn – Irakli

Trả lời

1

Tôi vừa mới viết một cái móc/mini kịch bản bash để giải quyết vấn đề này

#!/bin/bash 

if git log --pretty=format:%s -1 | grep -q "^test: " 
then 
    #action/update dev/test 
elif git log --pretty=format:%s -1 | grep -q "^production: " 
then 
    #action/update dev/test/production 
else 
    #action/update dev 
fi 

Đó là kịch bản bash đầu tiên của tôi như vậy .. xin vui lòng giúp đỡ để cải thiện điều này :)

+0

Sử dụng 'git checkout -f' ở đây có thể hữu ích. – jackyalcine

1

Bạn có thể viết một bài cam kết nối đó sẽ phân tích các cam kết thông báo bằng cách sử dụng một cái gì đó giống như git log -1 --format=%B và thực hiện hành động thích hợp như git push dev, vv

Nếu bạn đang nói về đẩy cam kết của bạn đến một repo trung tâm từ xa và rằng repo phải làm điều này, sau đó bạn phải sử dụng một móc post-receive theo cách tương tự. Lưu ý rằng các móc cam kết chạy trên repo ứng dụng khách mà bạn cam kết.

Với điều đó đã nói, hãy chuyển sang môi trường bằng cách sử dụng những gì bạn nói trong thư không phải là quy trình làm việc phù hợp. Bạn có thể có các nhánh khác nhau, nơi bạn có thể chọn hoa anh đào của bạn, vv Bạn có thể thiết lập các móc như vậy khi bạn đẩy đến chi nhánh test, môi trường kiểm tra được cập nhật và vân vân.

+0

Cảm ơn! Bạn đã giúp tôi – Irakli

+0

Bạn đã giúp tôi nhưng đó không phải là câu trả lời đầy đủ. Vui lòng kiểm tra bài đăng mới của tôi về vấn đề này. Cảm ơn một lần nữa! – Irakli

2

Dựa trên ý tưởng Irakli , đây là những gì tôi đã làm việc như một hậu nhận được trong repo của tôi ...

#!/bin/bash 

MESSAGE=$(git log -1 HEAD --pretty=format:%s) 

if [[ "$MESSAGE" == *\[staging\]* ]]; 
then 
    #action/update staging 
    # another method not being used... 
    # GIT_WORK_TREE=/path/to/working/site/ git checkout -q -f staging 
    echo "NOTE: Beginning Auto-Push to Staging Server... " 
    `git push staging` 
    echo "======================================================== 
======== Done! Pushed to STAGING.com ============= 
======== Thanks Captain. Keep up the good work! ======== 
========================================================" 
elif [[ "$MESSAGE" == *\[production\]* ]]; 
then 
    #action/update production 
    echo "NOTE: Beginning Auto-Push to Production Server... " 
    # `git push production` 
    echo "======================================================== 
======== Done!!! Pushed to Production.com ======= 
======== Test immediately for any errors! ========= 
========================================================" 
fi 

Lưu ý:

để thực hiện công việc 'git push staging', bạn cần phải có một móc .git/hooks/post-reveive trên cây làm việc đó. Tôi đã sử dụng this code ngoại trừ tôi đã thêm 'umask 002 & & git reset --hard' ở dưới cùng.

Tôi cũng đã có thêm một denyrecive để tập .git/config rằng cây làm việc của:

[receive] 
    denycurrentbranch = ignore 

Note 2:

Xin lưu ý thiết lập này không phải dành cho tất cả mọi người ... chỉ dành cho nhỏ (ish) các trang web nhanh chóng cập nhật các bản cập nhật bẩn &.

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