ใช้ git เป็นแหล่งเก็บข้อมูลส่วนกลาง


12

ฉันได้ตั้งค่าคอมไพล์สำหรับการใช้งานของตัวเอง - ดังนั้นฉันจึงสามารถเข้าถึงโครงการจาก 'ทุกที่' และรักษาความปลอดภัยของเวอร์ชันหากฉันทำงานบนส่วน X ตรงนี้และส่วน Y ตรงนี้และสามารถรวมหากจำเป็น

อย่างไรก็ตามมีเพียงหนึ่งในเครื่องพัฒนาของฉันที่มี IP แบบคงที่ สมองของฉันติดอยู่ในโหมด CVS ดังนั้นฉันจึงพยายามตั้งค่าคอมไพล์ให้เครื่องนั้นเป็นเซิร์ฟเวอร์ 'ศูนย์กลาง' ซึ่งคนอื่น ๆ ทั้งหมดดึงออกมา

งานประเภทนี้ ฉันมีเครืองจักรจำนวนมากที่ทำ git-pull จาก 'master' M. พวกเขาใช้ git ในการส่งข้อมูลกลับ

ปัญหาเกิดขึ้นถ้าฉันพัฒนาตัวต้นแบบ ครั้งแรกฉันไม่สามารถหาวิธีซื้อ repo ส่วนกลางเพื่อให้รุ่นล่าสุดโดยไม่ต้องทำ

git reset --hard HEAD

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

สิ่งที่เกี่ยวกับแบบจำลองจิตของฉันเป็นวิธีออก ช่วยด้วย?


เมื่อคุณพูดว่า "master" คุณกำลังพูดถึงที่เก็บข้อมูลหลักหรือสาขาหลักหรือไม่
innaM

พื้นที่เก็บข้อมูลหลัก
Alex Feinman

1
"master" ในบริบท git มักจะเป็นชื่อของสาขาเริ่มต้น
innaM

นี่อาจเป็นของ SO
Ken Liu

คำตอบ:


30

คุณต้องการให้ที่เก็บส่วนกลางของคุณว่างเปล่า สมมติว่าเครื่องที่ใช้งานมีชื่ออยู่static:

$ ssh static git init --bare /git/myproject.git

พื้นที่เก็บข้อมูลเปลือยนี้เป็นจุดนัดพบกลาง: มันสำหรับการผลักดันและดึงจากไม่ใช่การพัฒนา

ทำการพัฒนาของคุณบนพื้นที่เก็บข้อมูลส่วนกลาง:

$ cd ~/src
$ git clone static:/git/myproject.git

แม้ว่าคุณจะstaticทำงานอยู่ในโคลน:

$ git clone /git/myproject.git

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

ตัวอย่างเช่น:

$ git checkout -b fix-bug-in-foo
$ hack
$ git add file.c file.h
$ git commit -m "Fix ..."

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

บางทีคุณอาจกลับบ้านในคืนนั้นและเพิ่มคุณสมบัติใหม่ เช้าวันรุ่งขึ้นคุณ

$ git checkout master
$ git pull

เพื่ออัพเดตต้นแบบโลคัลของคุณเพื่อสะท้อนสิ่งที่อยู่ในที่เก็บส่วนกลาง

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

$ git checkout fix-bug-in-foo
$ git rebase master

rebaseคำสั่งทำให้ดูพื้นที่เก็บข้อมูลของคุณว่าคุณแก้ไขข้อบกพร่อง foo ที่ด้านบนของคืนที่ผ่านมาเป็นคุณลักษณะใหม่ (นี่เป็นสิ่งที่ชอบsvn updateแต่มีความยืดหยุ่นและทรงพลังมากกว่า)

ทีนี้เพื่อนำมันมาเป็นนายศูนย์กลางของคุณ:

$ git checkout master
$ git merge fix-bug-in-foo
$ git push origin master

เราปฏิบัติต่ออาจารย์เป็นพิเศษ แต่นั่นก็เป็นแค่เรื่องธรรมดา คุณสามารถแบ่งปันงานในที่เก็บสาขาต่าง ๆ ผ่านคลังเก็บข้อมูล git staticได้อย่างง่ายดาย


1
คำตอบที่ยอดเยี่ยมตอกย้ำปัญหาทั้งหมดที่อยู่ในมือ
Dan Loewenherz

การติดตั้ง git ของฉันไม่ยอมรับ --bare เป็นตัวเลือกสำหรับ git init (เวอร์ชั่นเก่า) แต่ฉันทำงานโดยการโคลนนิ่ง - ทำ repo ที่มีอยู่แล้วจากนั้นทำการแก้ไขไฟล์ config ด้วยตนเองเล็กน้อย
Alex Feinman

หากคุณใช้ git 1.6.4.x ก็git init --bareไม่มีข้อโต้แย้งอื่น ๆ มันจะใช้ไดเรกทอรีการทำงานปัจจุบันหรือการตั้งค่าสภาพแวดล้อม GIT_DIR ถ้าตั้ง ฉันเชื่อว่าคุณต้องการ git 1.6.5.x เพื่อให้มีอาร์กิวเมนต์ของไดเรกทอรี
Darren Hall

4
นั่นเป็นคำอธิบายเวิร์กโฟลว์คอมไพล์ที่ดีที่สุดที่ฉันเคยเห็นสำหรับงานที่ฉันทำ
เกร็กเกรแฮม

8

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


6

คำตอบนี้คล้ายกับคำตอบของ gbaconแต่ใช้วิธีการที่คุณมีการตั้งค่า repo ในพื้นที่อยู่แล้วและต้องการสร้างต้นแบบระยะไกลที่ถือว่าเป็น repo ส่วนกลาง มันเป็นเพียงการเพิ่มรายละเอียดจากวิธีการที่แตกต่างกัน

ฉันใช้คอมไพล์เพื่อเก็บไฟล์ dot-config ของฉัน ฉันผลักและดึงสิ่งที่ฉันคิดว่าเป็น 'repo ส่วนกลาง' มันค่อนข้างสะดวกในการรีเซ็ตไฟล์ dot ทั้งหมดของฉันผ่านคอมพิวเตอร์หลายเครื่อง

$ ssh example.com
$ mkdir dotconf.git && cd dotconf.git
$ git init --bare
$ exit

สิ่งนี้สร้าง repo เปล่าที่ว่างบนเว็บไซต์ repo

ตอนนี้ถ้าฉันมี repo ที่มีอยู่ในเครื่องอยู่แล้วฉันสามารถส่งไปที่ไซต์ระยะไกลได้

$ cd ~/src/dotconf

chdir ลงในไดเรกทอรีท้องถิ่น

$ git remote add origin ssh://example.com/~/dotconf.git

เพิ่ม repo ระยะไกลเป็นจุดเริ่มต้นดังนั้นการผลัก / ดึงจะทำหน้าที่กับ repo นั้น

$ git push origin master

ผลักต้นแบบของฉันไปที่ต้นกำเนิด (ตามที่ระบุไว้ก่อนหน้านี้ผ่านทางรีโมท git) ตอนนี้ repo ระยะไกลได้รับการปฏิบัติเหมือน 'repo ส่วนกลาง' ของฉัน การกดหรือดึง git ทั้งหมดของฉันจะโต้ตอบกับจุดกำเนิด

ถ้าฉันไปที่โฮสต์อื่นฉันสามารถดึงผ่านโคลนที่ repo ไปยังตำแหน่งใหม่ได้อย่างง่ายดาย

$ git clone ssh://example.com/~/dotconf.git

ถ้าฉันต้องการพัฒนาบนเซิร์ฟเวอร์ระยะไกลฉันจะโคลนก่อนจากนั้นดัน / ดึงกลับเข้าไปใน repo เปล่า

$ cd ~/src
$ git clone ~/dotconf.git
$ cd ~/src/dotconf
  * do coding *
$ git push
  * check in from another location *
$ git pull

คุณอาจจะต้องตั้งค่าgit config --add branch.master.remote originให้คุณgit pullอย่าบ่นว่าคุณไม่ได้มีความเฉพาะเจาะจงมากพอ อีกทางเลือกหนึ่งคือการตั้งสาขาหลักของคุณ--trackเป็นแหล่งกำเนิดระยะไกล มีประโยชน์ถ้าคุณมีหลายสาขา


1

ฉันเพิ่งค้นคว้าปัญหาเดียวกันนี้วันนี้ โพสต์บล็อกนี้มีการอภิปรายจำนวนมากเกี่ยวกับปัญหา แต่ความเห็นส่วนใหญ่คือการทำสิ่งที่ Manni พูด ดูความคิดเห็นเกี่ยวกับการโพสต์ของ David French สำหรับความเป็นไปได้อื่น ๆ รวมถึงสิ่งที่ต้องทำหากคุณจบลงด้วยการผลักดันไปยังพื้นที่เก็บข้อมูลที่มีการทำงานที่ปราศจากข้อผูกมัดในดัชนีหรือแผนผังการทำงาน "รีเซ็ต git - soft HEAD ^" จะถอยกลับการเปลี่ยนแปลงที่ถูกผลักโดยไม่รบกวนการทำงานของคุณ


2
ปัญหาหนึ่งของการโพสต์บล็อกคือการข้ามประโยชน์ของดัชนี นี่เป็นบทความที่ดีที่จะอธิบายวิธีทำงานกับ git แทนที่จะเป็น git - osteele.com/archives/2008/05/my-git-workflow - มีแผนผังเวิร์กโฟลว์
Darren Hall
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.