Git Hooks

เผยแพร่แล้ว: 2022-07-02

Git เป็นระบบควบคุมเวอร์ชันที่มีประสิทธิภาพซึ่งเราแทบไม่ได้ขีดข่วนพื้นผิวในโพสต์ล่าสุดของเรา วันนี้ เราจะมาดูพลังของระบบอัตโนมัติที่ Git สามารถมอบให้คุณด้วย Git Hooks

ที่เก็บทุกอันจะมี hooks ในตัวเมื่อคุณใช้คำสั่ง git init เมื่อเริ่มต้นพื้นที่เก็บข้อมูล คุณจะได้รับไดเร็กทอรี .git ที่ซ่อนอยู่ และภายในนั้นเป็นไดเร็กทอรีที่เรียกว่า hooks ซึ่งจะมี hooks ทั้งหมดของคุณ เปิดที่เก็บ git ที่คุณสะดวกและใช้ ls -a เพื่อดูไดเร็กทอรีที่ซ่อนอยู่ จากนั้นเปิดขึ้นมาในตัวแก้ไขโค้ดที่คุณโปรดปราน

ในการเริ่มต้น คุณจะเห็นไฟล์จำนวนมากที่มีนามสกุลไฟล์ . .sample นี่คือสิ่งที่เขาพูดกัน สคริปต์ตัวอย่างที่คุณสามารถใช้ในโปรเจ็กต์ของคุณได้ ไฟล์มีชื่อเพื่อให้สอดคล้องกับ hook ที่เรียกใช้ ดังนั้น post-commit.sample จะทำงานบนเบ็ดหลังการคอม post-commit

คุณสามารถใช้ภาษาใดก็ได้ในการเขียนเบ็ด ไฟล์จะถูกแยกวิเคราะห์ตามสัญกรณ์ shebang ที่ด้านบนของไฟล์ หากคุณต้องการใช้โหนด คุณจะต้องใช้ #! /usr/bindi/env node #! /usr/bindi/env node และไฟล์ของคุณจะถูกแยกวิเคราะห์เป็นไฟล์โหนด

ก่อนที่เราจะเจาะลึกลงไปว่าคุณสามารถทำอะไรกับ git hooks ได้บ้าง มาดู hooks บางส่วนที่คุณสามารถใช้ได้

ประเภทของ Git Hooks

ยอมรับเวิร์กโฟลว์ Hooks

pre-commit จะทำงานก่อนที่คุณจะป้อนข้อความยืนยัน และสามารถข้ามได้ด้วย git commit --no-verify

prepare-commit-msg สามารถใช้เพื่อแก้ไขข้อความเริ่มต้นที่คุณเห็นในข้อความยืนยันของคุณ ใช้เพื่อให้คำแนะนำแก่นักพัฒนาเกี่ยวกับประเภทของข้อความยืนยันที่พวกเขาควรจะทิ้งไว้ นอกจากนี้ยังสามารถใช้เพื่อทำให้เนื้อหาที่สร้างข้อความโดยอัตโนมัติสำหรับคุณโดยอัตโนมัติ เช่น การรวมหรือเพิ่มหมายเลขปัญหาในข้อความยืนยันของคุณโดยอัตโนมัติ

commit-msg สามารถใช้ตรวจสอบข้อความยืนยันสำหรับโปรเจ็กต์ของคุณได้ บางทีคุณอาจไม่ต้องการให้ใครใส่ข้อความที่เขียนว่า "การจัดการกับพื้นที่สีขาว" ได้ คุณสามารถใช้ hook นี้เพื่อตรวจหาการมีอยู่ของคำว่า white space จากนั้นออกและเตือนผู้ใช้ว่าพวกเขาจำเป็นต้องมีข้อความยืนยันที่ดีกว่า

post-commit ทำงานหลังจาก commit hook ด้านบนทั้งหมด มีประโยชน์มากที่สุดสำหรับการแจ้งเตือนว่ามีการคอมมิต

ตะขอลูกค้า

post-checkout ทำงานหลังจากที่คุณเรียกใช้คำสั่ง git checkout สำเร็จ ถ้าคุณมีชุดของไฟล์ขนาดใหญ่ที่ใช้บนไซต์แต่ไม่ต้องการให้มีในซอร์สคอนโทรล คุณสามารถใช้คำสั่งนี้เพื่อย้ายไฟล์ให้กับคุณได้

pre-push รันระหว่างคำสั่ง git push ก่อนที่อ็อบเจ็กต์ใด ๆ จะถูกถ่ายโอนไปยังที่เก็บระยะไกล

ตะขอเซิร์ฟเวอร์

pre-receive ทำงานเมื่อไคลเอนต์ได้พุชรหัสไปยังที่เก็บระยะไกล สามารถใช้เพื่อตรวจสอบรหัสที่กำลังผลักเพื่อให้แน่ใจว่าตรงตามเกณฑ์ของโครงการของคุณก่อนที่คุณจะยอมรับการพุช

post-receive ทำงานหลังจากที่ที่เก็บระยะไกลของคุณได้รับการอัพเดตแล้ว สามารถใช้เรียก web hook ที่ทริกเกอร์กระบวนการปรับใช้หรือแจ้งห้องสนทนาว่าได้รับคอมมิตแล้วและพร้อมสำหรับการตรวจสอบ

hooks หลายตัวด้านบนสามารถตั้งค่าให้ทำงานเฉพาะบนกิ่งบางสาขาเท่านั้น นั่นอาจหมายถึงเมื่อคุณใช้เบ็ด post-receive เฉพาะเมื่อมีคนพุชรหัสไปยังสาขาหลักที่ควรจะพร้อมที่จะปรับใช้ สามารถแจ้งรายชื่อนักพัฒนาซอฟต์แวร์ให้ตรวจสอบโค้ดแล้วปรับใช้ได้ วิธีนี้จะทำให้คุณมีตา 2 ชุดในการปรับใช้เสมอ ซึ่งอาจหมายถึงการจับข้อผิดพลาดที่นักพัฒนาคนเดียวอาจพลาดได้ง่าย

ฉันข้ามตะขอที่มีอยู่แล้วเพราะฉันไม่เคยเห็นความจำเป็นในการใช้มัน ตะขอชุดหนึ่งที่ฉันไม่ได้พูดถึงคือตะขอเกี่ยวกับเวิร์กโฟลว์อีเมล หากคุณไม่ยอมรับแพตช์สำหรับโค้ดของคุณทางอีเมล คุณก็ไม่จำเป็นต้องใช้แพตช์ดังกล่าว คุณสามารถค้นหา hooks ทั้งหมดที่มีอยู่ในเอกสารประกอบ

ในทางปฏิบัติ hooks ที่ฉันใช้บ่อยที่สุดคือ:

  • สัญญาล่วงหน้า
  • กดล่วงหน้า
  • ส่ง-msg
  • รับล่วงหน้า
  • โพสต์คอมมิต
  • หลังรับ

ทีนี้มาทำอะไรกับตะขอพวกนี้กัน

การเปิดใช้งานปลั๊กอิน WordPress ด้วย WP Cli และ Git Hooks

สำหรับโปรเจ็กต์ลูกค้ารายหนึ่งในปีนี้ ฉันกำลังเพิ่มร้านค้า และยังคงทำงานสองสามอย่างบนไซต์หลัก นั่นหมายความว่าไซต์หลัก ไม่มี ปลั๊กอิน WooCommerce ของเราติดตั้งหรือเปิดใช้งาน ฉันจำเป็นต้องพัฒนาร้านค้า WooCommerce บนสาขาเดียว และเมื่อฉันพร้อมที่จะเผยแพร่ทั้งหมด ฉันต้องการย้าย WooCommerce ไปที่หลักหรือไม่

ในการเริ่มต้น เราจำเป็นต้องมีสาขาใหม่ชื่อร้าน เราสามารถรับสิ่งนี้ได้โดยใช้ git checkout -b store สิ่งนี้จะสร้างสาขาใหม่และตรวจสอบให้เรา ตอนนี้เรามาเตรียมเบ็ดกัน

ขั้นแรกเราต้องสร้าง post-checkout hook ด้วยคำสั่งนี้ touch .git/hooks/post-checkout

ต่อไปเราต้องทำให้ปฏิบัติการได้ เราสามารถทำได้ด้วยคำสั่ง chmod จากเทอร์มินัล chmod +x .git/hooks/post-checkout

ตอนนี้ให้เปิดไฟล์ในตัวแก้ไขโค้ดที่คุณเลือก และคัดลอกโค้ดด้านล่างลงในไฟล์ post-checkout

#! /bin/bash

wp plugin activate woocommerce

echo "activated WooCommerce"

wp plugin activate automatewoo

echo "activated AutomateWoo"

คุณสามารถสาธิตสิ่งนี้ได้โดยเปลี่ยนเป็นสาขาใดก็ได้ผ่านเทอร์มินัล คุณควรเห็นสองบรรทัดที่บอกคุณว่า WooCommerce และ AutomateWoo เปิดใช้งานแล้ว เรารู้ว่ามันใช้งานได้ แต่มันไม่ใช่อย่างที่เราต้องการเพราะมันจะเปิดปลั๊กอินทุกครั้งที่เราเปลี่ยนเป็นสาขาใดๆ

สิ่งที่เราต้องการจริงๆ คือ เปิดใช้งานเมื่อเราย้ายไปที่สาขาร้านค้าของเรา แล้วปิดเมื่อเราอยู่ที่สาขาหลักของเรา ในการทำเช่นนั้น เราต้องใช้เบ็ดเพื่อตรวจสอบว่าเราเป็นสาขาใด สลับเนื้อหาของ post-checkout ด้วยรหัสด้านล่าง

#! /bin/bash

oldrev=$1
newrev=$2

branch_name="(git symbolic-ref HEAD 2>/dev/null)"

if [ "refs/head/store" = "$branch_name" ];then
wp plugin activate woocommerce
echo "activated Woo"

wp plugin activate automatewoo
echo "activated AutomateWoo"
fi

if [ "refs/head/main" = "$branch_name" ];then
wp plugin deactivate woocommerce
echo "deactivated Woo"

wp plugin deactivate automatewoo
echo "deactivated AutomateWoo"
fi

รหัสนี้เริ่มต้นด้วยการกำหนดสาขาที่เรากำลังตรวจสอบให้กับตัวแปร branch_name แล้วเรามีคำสั่ง if สองอัน เช็คก่อนว่าย้ายสาขามาหรือยัง ถ้าเรามี จะใช้ WP CLI เพื่อเปิดใช้งาน WooCommerce และ AutomateWoo

คำสั่ง if ต่อไปจะตรวจสอบว่าเราอยู่ในสาขาหลักหรือไม่ หากเป็นเช่นนั้น มันจะปิดการใช้งานปลั๊กอินด้วย WP CLI และบอกเราเกี่ยวกับมันในเทอร์มินัล

การควบคุมเวิร์กโฟลว์ Git ด้วย Git Hooks

ในโพสต์ก่อนหน้าเกี่ยวกับ Git ฉันได้พูดคุยเกี่ยวกับเวิร์กโฟลว์ Git ต่างๆ กรณีการใช้งานทั่วไปอย่างหนึ่งสำหรับ hooks คือการป้องกันไม่ให้ใครก็ตามส่งรหัสไปยังสาขาหลักโดยตรง คุณสามารถใช้ hook เพื่อให้แน่ใจว่าโค้ดทั้งหมดถูกรวมจากสาขาอื่นเข้ากับ main

เริ่มต้นด้วยการเปลี่ยนชื่อ pre-commit.sample เป็น pre-commit แล้วทำให้ปฏิบัติการได้ตามที่อธิบายไว้ข้างต้น ถัดไป คว้าโค้ดด้านล่างและใช้ในไฟล์ pre-commit

#! /bin/bash

username=$GIT_AUTHOR_NAME
branch="$(git symbolic-ref HEAD 2>/dev/null)"

if [ "$branch" = "refs/heads/main" ]; then
echo "WHOA that was '"${branch}"' you should not do that. Stop doing silly stuff and create your own branch and merge it."
exit 1 # if you remove this it won't block the commit but it will send the message to slack

fi

การตรวจสอบนี้เพื่อดูว่าเราอยู่ในสาขาหลักหรือไม่ และหากเป็นเช่นนั้น การคอมมิทจะหยุดลง จากนั้นจะพิมพ์การแจ้งเตือนไปยังผู้ใช้ว่าไม่ควรส่งไปยังสาขาหลักโดยตรง

อย่าลืมว่าหลายๆ แห่งกำลังเปลี่ยนเป็นสาขา main โปรเจ็กต์ที่เก่ากว่าอาจต้องใช้ master ที่นี่หากยังไม่ได้อัปเดต

คุณสามารถก้าวไปอีกขั้นแล้วใช้ cURL เพื่อเข้าถึง API ของแอปแชท แล้วบ่นต่อสาธารณะว่ามีคนพยายามจะผูกมัดกับ main

ข้อจำกัดเพียงอย่างเดียวของ git hooks คือจินตนาการของคุณ คุณสามารถใช้มันเพื่อหยุดใครบางคนจากการคอมมิตหากมี TODO อยู่ในโค้ดของพวกเขา หรือเพื่อหยุดช่องว่างที่ส่วนท้ายของไฟล์

หากคุณมีบางส่วนของเวิร์กโฟลว์ที่สะดุดสะดุดอย่างต่อเนื่อง ให้ดูที่ตะขอเพื่อทำให้เป็นอัตโนมัติ คุณจะได้ไม่ต้องจำ