ชำระเงินอัตโนมัติหลังจากกด


2

โดยพื้นฐานแล้วฉันแค่ต้องการใช้ git เป็น FTP แบบทางเดียว

ฉันมี repo คอมไพล์ท้องถิ่นlocal/มา ฉันต้องการที่จะผลักดันให้server:remote/และฉันต้องการที่หลังจากนั้นไฟล์ทั้งหมดจะถูกตรวจสอบออกมาในremoteบนเซิร์ฟเวอร์ (เหมือนกันกับสิ่งที่มันมีลักษณะเฉพาะที่สมมติว่าผมgit-added ทุกอย่าง)

กล่าวอีกนัยหนึ่งฉันต้องการจำลองพฤติกรรมนี้จาก Mercurial:

[hooks]
changegroup.update = hg update && echo updated successfully.

ฉันพบบทเรียนมากมายที่ทำเช่นนี้กับสองไดเรกทอรีแยกกันในฝั่งเซิร์ฟเวอร์ แต่ฉันต้องการใช้เพียงหนึ่งเดียว เป็นไปได้ไหม เมื่อฉันลองฉันได้รับข้อความด้านล่างซึ่งฉันไม่เข้าใจจริงๆ

อะไรคือวิธีปฏิบัติที่ดีที่สุดในการทำสิ่งนี้? (หากจำเป็นคุณสามารถสันนิษฐานได้ว่าฉันไม่เคยเปลี่ยนแปลงอะไรบนเซิร์ฟเวอร์ดังนั้น--forceสิ่งที่จะไม่เป็นปัญหา)

remote: error: refusing to update checked out branch: refs/heads/master
remote: error: By default, updating the current branch in a non-bare repository
remote: error: is denied, because it will make the index and work tree inconsistent
remote: error: with what you pushed, and will require 'git reset --hard' to match
remote: error: the work tree to HEAD.
remote: error: 
remote: error: You can set 'receive.denyCurrentBranch' configuration variable to
remote: error: 'ignore' or 'warn' in the remote repository to allow pushing into
remote: error: its current branch; however, this is not recommended unless you
remote: error: arranged to update its work tree to match what you pushed in some
remote: error: other way.
remote: error: 
remote: error: To squelch this message and still keep the default behaviour, set
remote: error: 'receive.denyCurrentBranch' configuration variable to 'refuse'.

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

1
การทำสิ่งต่าง ๆ ด้วยวิธีนี้หมายความว่าใน FTP คุณมีประวัติคอมไพล์ทั้งหมดใน.gitโฟลเดอร์ย่อย คุณอาจจะหรืออาจไม่ต้องการ จำกัด สิ่งนั้นตามค่าเริ่มต้นมันจะพร้อมใช้งานจากเซิร์ฟเวอร์ FTP ของคุณ นอกจากผลกระทบของดิสก์
Patrick Mevzek

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

คำตอบ:


2

ฉันต้องการจำลองพฤติกรรมนี้จาก Mercurial:

ด้วยเวอร์ชัน git ล่าสุดการตั้งค่าที่กล่าวถึงในข้อความแสดงข้อผิดพลาดในขณะนี้รองรับค่าใหม่:

[receive]
    denyCurrentBranch = updateInstead

สิ่งนี้จะให้พฤติกรรมที่คุณต้องการอย่างแท้จริง


ฉันพบบทเรียนมากมายที่ทำเช่นนี้ด้วยสองไดเรกทอรีแยกกันที่ฝั่งเซิร์ฟเวอร์

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

git push origin master:deploy

ตอนนี้คุณสามารถใช้ที่คล้ายกัน (หรือแม้กระทั่งเหมือนกัน) post-receiveหรือpost-updatehooks ราวกับว่าคุณกำลังผลักดันไปยังพื้นที่เก็บข้อมูลเปลือย ยกตัวอย่างเช่นเบ็ดสามารถทำงานหรือแม้กระทั่งgit merge --ff-only deploygit reset --hard deploy


นั่นคือสิ่งที่ฉันต้องการขอบคุณ! ลิงค์แรกนั้นยอดเยี่ยมและอธิบายการใช้งานที่ถูกต้องสำหรับสิ่งนี้ ดูเหมือนว่าฉันควรจะได้รวมการปรับใช้เมื่อค้นหา :)
แมเรียน
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.