นี่คือสิ่งที่ฉันไม่ชอบเกี่ยวกับคอมไพล์:
ก่อนอื่นฉันคิดว่าความคิดแบบกระจายนั้นบินไปมาเมื่อเผชิญกับความเป็นจริง ทุกคนที่ใช้คอมไพล์จริงก็ทำแบบรวมศูนย์แม้แต่ Linus Torvalds หากเคอร์เนลได้รับการจัดการแบบกระจายนั่นหมายความว่าฉันไม่สามารถดาวน์โหลดแหล่งที่มาของเคอร์เนล "อย่างเป็นทางการ" ได้ - ไม่มีเลย - ฉันต้องตัดสินใจว่าฉันต้องการเวอร์ชันของ Linus หรือเวอร์ชันของ Joe หรือเวอร์ชันของบิล เห็นได้ชัดว่ามันไร้สาระและนั่นเป็นเหตุผลว่าทำไมจึงมีคำจำกัดความอย่างเป็นทางการซึ่ง Linus ควบคุมโดยใช้เวิร์กโฟลว์แบบรวมศูนย์
หากคุณยอมรับว่าคุณต้องการคำจำกัดความแบบรวมศูนย์ของเนื้อหาของคุณก็จะเห็นได้ชัดว่าบทบาทเซิร์ฟเวอร์และไคลเอนต์แตกต่างกันอย่างสิ้นเชิงดังนั้นความเชื่อที่ว่าไคลเอนต์และซอฟต์แวร์เซิร์ฟเวอร์ควรจะเหมือนกันจึงกลายเป็นข้อ จำกัด อย่างแท้จริง เชื่อว่าลูกค้าและเซิร์ฟเวอร์ข้อมูลที่ควรจะเหมือนกันจะกลายเป็นไร้สาระยะโดยเฉพาะอย่างยิ่งใน codebase ที่ก็มีสิบห้าปีของประวัติศาสตร์ที่ไม่มีใครใส่ใจเกี่ยวกับ แต่ทุกคนจะต้องมีการโคลน
สิ่งที่เราอยากจะทำจริงๆกับของเก่าทั้งหมดนั้นคือการเก็บมันไว้ในตู้และลืมไปว่ามันอยู่ที่นั่นเหมือนกับที่ VCS ทั่วไปทำ ความจริงที่ว่าคอมไพล์ลากมันไปมาบนเครือข่ายทุกวันนั้นอันตรายมากเพราะมันทำให้คุณต้องตัดมันทิ้ง การตัดแต่งกิ่งนั้นเกี่ยวข้องกับการตัดสินใจที่น่าเบื่อมากมายและอาจผิดพลาดได้ ดังนั้นผู้คนอาจจะเก็บสแน็ปช็อต repos ทั้งชุดจากจุดต่างๆในประวัติศาสตร์ แต่นั่นไม่ใช่ว่าการควบคุมแหล่งที่มาคืออะไรในตอนแรก? ปัญหานี้ไม่เกิดขึ้นจนกว่าจะมีคนคิดค้นแบบจำลองแบบกระจาย
Git กระตุ้นให้ผู้คนเขียนประวัติศาสตร์ซ้ำและข้างต้นอาจเป็นสาเหตุหนึ่งที่ทำให้เกิดสิ่งนั้น VCS ปกติทุกตัวทำให้ประวัติการเขียนใหม่เป็นไปไม่ได้สำหรับทุกคนยกเว้นผู้ดูแลระบบและทำให้แน่ใจว่าผู้ดูแลระบบไม่มีเหตุผลที่จะพิจารณา แก้ไขฉันถ้าฉันผิด แต่เท่าที่ฉันรู้ git ไม่มีทางให้สิทธิ์การเขียนแก่ผู้ใช้ทั่วไป แต่ห้ามไม่ให้เขียนประวัติซ้ำ นั่นหมายความว่านักพัฒนาซอฟต์แวร์ใด ๆ ที่มีความไม่พอใจ (หรือผู้ที่ยังคงดิ้นรนกับช่วงการเรียนรู้) สามารถทิ้งโค้ดเบสทั้งหมดได้ เราจะกระชับอันนั้นได้อย่างไร? ไม่ว่าคุณจะทำการสำรองข้อมูลประวัติทั้งหมดเป็นประจำเช่นคุณเก็บประวัติไว้เป็นกำลังสองหรือคุณห้ามการเข้าถึงการเขียนทั้งหมดยกเว้นคนที่น่าสงสารบางคนที่จะได้รับความแตกต่างทั้งหมดทางอีเมลและรวมเข้าด้วยกัน
ลองดูตัวอย่างโครงการขนาดใหญ่ที่ได้รับการสนับสนุนอย่างดีและดูว่า git ทำงานอย่างไรสำหรับพวกเขา: Android ครั้งหนึ่งฉันตัดสินใจที่จะเล่นกับระบบ Android เอง ฉันพบว่าฉันควรจะใช้สคริปต์จำนวนมากที่เรียกว่า repo เพื่อรับคอมไพล์ของพวกเขา repo บางส่วนทำงานบนไคลเอนต์และบางส่วนบนเซิร์ฟเวอร์ แต่ทั้งสองอย่างนั้นแสดงให้เห็นถึงความจริงที่ว่า git ไม่สมบูรณ์ในความสามารถอย่างใดอย่างหนึ่ง สิ่งที่เกิดขึ้นคือฉันไม่สามารถดึงแหล่งข้อมูลได้ประมาณหนึ่งสัปดาห์จากนั้นก็ล้มเลิกไปทั้งหมด ฉันจะต้องดึงข้อมูลจำนวนมหาศาลจากที่เก็บต่างๆมากมาย แต่เซิร์ฟเวอร์ก็มีคนอย่างฉันมากเกินไป Repo หมดเวลาและไม่สามารถดำเนินการต่อจากจุดที่หมดเวลาได้ ถ้าคอมไพล์กระจายได้มากคุณคงคิดว่า d ได้ทำบางอย่างแบบเพียร์ทูเพียร์เพื่อลดภาระบนเซิร์ฟเวอร์เครื่องหนึ่ง Git สามารถแจกจ่ายได้ แต่ไม่ใช่เซิร์ฟเวอร์ Git + repo เป็นเซิร์ฟเวอร์ แต่ repo ไม่สามารถแจกจ่ายได้เนื่องจากเป็นเพียงชุดแฮ็กเฉพาะกิจ
ภาพประกอบที่คล้ายกันของความไม่เพียงพอของ git คือ gitolite (และบรรพบุรุษของมันซึ่งดูเหมือนจะไม่ได้ผลดีนัก) Gitolite อธิบายถึงงานของมันในการทำให้การปรับใช้เซิร์ฟเวอร์ git ง่ายขึ้น อีกครั้งการมีอยู่ของสิ่งนี้พิสูจน์ให้เห็นว่า git ไม่ใช่เซิร์ฟเวอร์ แต่เป็นไคลเอนต์ ยิ่งไปกว่านั้นมันจะไม่เป็นเช่นนั้นเพราะถ้ามันเติบโตขึ้นมามันจะเป็นการทรยศต่อหลักการก่อตั้ง
แม้ว่าคุณจะเชื่อในสิ่งที่กระจาย แต่คอมไพล์ก็ยังคงเป็นระเบียบ ตัวอย่างเช่นสาขาคืออะไร? พวกเขาบอกว่าคุณสร้างสาขาโดยปริยายทุกครั้งที่คุณโคลนที่เก็บ แต่นั่นไม่สามารถเป็นสิ่งเดียวกับสาขาในที่เก็บเดียวได้ นั่นคืออย่างน้อยสองสิ่งที่แตกต่างกันที่เรียกว่ากิ่งไม้ แต่จากนั้นคุณสามารถกรอกลับใน repo และเริ่มแก้ไขได้ มันเหมือนสาขาประเภทที่สองหรืออะไรที่แตกต่างออกไป อาจขึ้นอยู่กับประเภทของ repo ที่คุณมี - โอ้ใช่ - ดูเหมือนว่า repo ไม่ใช่แนวคิดที่ชัดเจนเช่นกัน มีทั้งตัวปกติและตัวเปล่า คุณไม่สามารถดันเป็นส่วนปกติได้เนื่องจากส่วนที่เปลือยเปล่าอาจไม่ตรงกับโครงสร้างต้นทาง แต่คุณไม่สามารถนำเข้า cvsimport แบบเปลือยได้เพราะพวกเขาไม่ได้คิดถึงสิ่งนั้น ดังนั้นคุณต้อง cvsimport เป็นแบบปกติ โคลนนั้นเป็นไฟล์เปล่าที่นักพัฒนาตีและ cvsexport นั้นไปยังสำเนาที่ใช้งานได้ cvs ซึ่งยังต้องตรวจสอบเป็น cvs ใครจะไปรบกวนได้ ภาวะแทรกซ้อนเหล่านี้มาจากไหน? จากความคิดที่กระจายตัวเอง ในที่สุดฉันก็ทิ้ง gitolite เพราะมันทำให้ฉันมีข้อ จำกัด มากขึ้น
Git กล่าวว่าการแยกสาขาควรมีน้ำหนักเบา แต่หลาย บริษัท มีปัญหาสาขาที่โกงร้ายแรงอยู่แล้วดังนั้นฉันจึงคิดว่าการแยกสาขาควรเป็นการตัดสินใจครั้งสำคัญด้วยการรักษาที่เข้มงวด นี่คือจุดที่ perforce ส่องแสงจริงๆ ...
ในการบังคับใช้คุณแทบไม่จำเป็นต้องมีสาขาเพราะคุณสามารถเล่นกลชุดการเปลี่ยนแปลงได้อย่างคล่องตัว ตัวอย่างเช่นขั้นตอนการทำงานตามปกติคือคุณซิงค์กับเวอร์ชันล่าสุดที่รู้จักบนเมนไลน์จากนั้นเขียนคุณลักษณะของคุณ เมื่อใดก็ตามที่คุณพยายามแก้ไขไฟล์ความแตกต่างของไฟล์นั้นจะถูกเพิ่มเข้าไปใน "ชุดการเปลี่ยนแปลงเริ่มต้น" ของคุณ เมื่อคุณพยายามตรวจสอบในชุดการเปลี่ยนแปลงระบบจะพยายามรวมข่าวสารจากสายหลักเข้ากับชุดการเปลี่ยนแปลงของคุณโดยอัตโนมัติ (เปลี่ยนฐานข้อมูลอย่างมีประสิทธิภาพ) แล้วจึงดำเนินการ เวิร์กโฟลว์นี้บังคับใช้โดยที่คุณไม่จำเป็นต้องเข้าใจด้วยซ้ำ Mainline จึงรวบรวมประวัติของการเปลี่ยนแปลงซึ่งคุณสามารถเลือกทางของคุณได้อย่างง่ายดายในภายหลัง ตัวอย่างเช่นสมมติว่าคุณต้องการเปลี่ยนกลับรายการเก่ากล่าวว่าก่อนหน้าก่อนสุดท้าย คุณซิงค์กับช่วงเวลาก่อนการเปลี่ยนแปลงที่ละเมิดทำเครื่องหมายไฟล์ที่ได้รับผลกระทบเป็นส่วนหนึ่งของชุดการเปลี่ยนแปลง ซิงค์กับช่วงเวลาหลังจากนั้นและรวมเข้ากับ "always mine" (มีบางอย่างที่น่าสนใจมากที่นั่น: การซิงค์ไม่ได้หมายความว่าจะมีสิ่งเดียวกัน - หากไฟล์สามารถแก้ไขได้ (เช่นในชุดการเปลี่ยนแปลงที่ใช้งานอยู่) มันจะไม่ถูกรวมโดยการซิงค์ แต่ทำเครื่องหมายว่าครบกำหนดสำหรับการแก้ไข) ตอนนี้คุณมี รายการการเปลี่ยนแปลงที่ยกเลิกรายการที่กระทำผิด รวมข่าวที่ตามมาและคุณมีรายการการเปลี่ยนแปลงที่คุณสามารถป๋อมแป๋มบนเมนไลน์เพื่อให้ได้เอฟเฟกต์ที่ต้องการ เราไม่ได้เขียนประวัติศาสตร์อะไรเลย รวมข่าวที่ตามมาและคุณมีรายการการเปลี่ยนแปลงที่คุณสามารถป๋อมแป๋มบนเมนไลน์เพื่อให้ได้เอฟเฟกต์ที่ต้องการ เราไม่ได้เขียนประวัติศาสตร์อะไรเลย รวมข่าวที่ตามมาและคุณมีรายการการเปลี่ยนแปลงที่คุณสามารถป๋อมแป๋มบนเมนไลน์เพื่อให้ได้เอฟเฟกต์ที่ต้องการ เราไม่ได้เขียนประวัติศาสตร์อะไรเลย
ตอนนี้สมมติว่าผ่านไปครึ่งทางแล้วจะมีใครบางคนวิ่งมาหาคุณและบอกให้คุณทิ้งทุกอย่างและแก้ไขข้อบกพร่องบางอย่าง คุณเพียงแค่ตั้งชื่อรายการการเปลี่ยนแปลงเริ่มต้นของคุณ (เป็นตัวเลขจริง) จากนั้น "ระงับ" แก้ไขข้อบกพร่องในรายการการเปลี่ยนแปลงเริ่มต้นที่ว่างเปล่าในขณะนี้ยอมรับและดำเนินการรายการการเปลี่ยนแปลงที่ตั้งชื่อต่อ เป็นเรื่องปกติที่จะมีการระงับรายการการเปลี่ยนแปลงหลายรายการในเวลาที่คุณลองทำสิ่งต่างๆ เป็นเรื่องง่ายและเป็นส่วนตัว คุณได้รับสิ่งที่คุณต้องการจริงๆจากระบอบการปกครองแบบสาขาโดยไม่มีสิ่งล่อใจที่จะผัดวันประกันพรุ่งหรือไก่ออกจากการรวมเข้ากับเมนไลน์
ฉันคิดว่ามันเป็นไปได้ในทางทฤษฎีที่จะทำสิ่งที่คล้ายกันในคอมไพล์ แต่คอมไพล์ทำให้ทุกอย่างเป็นไปได้จริงแทนที่จะยืนยันขั้นตอนการทำงานที่เราเห็นด้วย โมเดลแบบรวมศูนย์คือการทำให้เข้าใจง่ายที่ถูกต้องจำนวนมากซึ่งสัมพันธ์กับโมเดลแบบกระจายซึ่งเป็นลักษณะทั่วไปที่ไม่ถูกต้อง มีการใช้งานทั่วไปมากเกินไปโดยทั่วไปคาดว่าคุณจะใช้การควบคุมแหล่งที่มาที่ด้านบนเช่นเดียวกับที่ repo ทำ
สิ่งอื่นคือการจำลองแบบ ในคอมไพล์ทุกอย่างเป็นไปได้ดังนั้นคุณต้องคิดออกด้วยตัวคุณเอง ในการบังคับใช้คุณจะได้รับแคชไร้สถานะที่มีประสิทธิภาพ การกำหนดค่าเดียวที่จำเป็นต้องรู้คือตำแหน่งที่ต้นแบบอยู่และลูกค้าสามารถชี้ไปที่ต้นแบบหรือแคชได้ตามดุลยพินิจของพวกเขา นั่นเป็นงานห้านาทีและไม่ผิดพลาด
นอกจากนี้คุณยังมีทริกเกอร์และแบบฟอร์มที่ปรับแต่งได้สำหรับการยืนยันการตรวจสอบโค้ดการอ้างอิง Bugzilla และอื่น ๆ และแน่นอนคุณมีสาขาสำหรับเมื่อคุณต้องการจริงๆ ไม่ใช่เคสใส แต่อยู่ใกล้และติดตั้งและบำรุงรักษาง่าย
สรุปแล้วฉันคิดว่าถ้าคุณรู้ว่าคุณจะทำงานแบบรวมศูนย์ซึ่งทุกคนทำคุณอาจใช้เครื่องมือที่ออกแบบมาโดยคำนึงถึงสิ่งนั้นด้วย Git ถูก overrated เนื่องจากความฉลาดที่น่ากลัวของ Linus พร้อมกับแนวโน้มของผู้คนที่จะติดตามซึ่งกันและกันเหมือนแกะ แต่ raison d'etre หลักของมันไม่ได้ยืนหยัดกับสามัญสำนึกและด้วยการทำตาม git ผูกมือของตัวเองด้วย ความเชื่อที่ยิ่งใหญ่สองประการที่ (ก) ซอฟต์แวร์และ (ข) ข้อมูลต้องเหมือนกันทั้งในไคลเอนต์และเซิร์ฟเวอร์และนั่นจะทำให้มันซับซ้อนและง่อยอยู่เสมอในงานที่รวมศูนย์