ฉันจะอัปเดต repo เปล่าของฉันได้อย่างไร


134

ฉันสร้างที่เก็บเปล่าเพื่อเผยแพร่ที่เก็บของฉัน แต่ฉันไม่สามารถหาวิธีอัปเดตที่เก็บเปล่าด้วยสถานะปัจจุบันของที่เก็บหลัก


2
ดูคำตอบนี้: stackoverflow.com/questions/315911/…
Ken Bloom

คำตอบ:


84

หากคุณต้องการทำซ้ำวัตถุทั้งหมดจาก repo หลักให้ทำสิ่งนี้ภายใน repo หลัก:

git push --all <url-of-bare-repo>

หรือทำการดึงข้อมูลภายใน repo เปล่า:

git fetch <url-of-main-repo>

คุณไม่สามารถทำการดึงได้เนื่องจากการดึงต้องการรวมเข้าด้วยHEADกันซึ่ง repo เปล่าไม่มี

คุณสามารถเพิ่มสิ่งเหล่านี้เป็นรีโมทเพื่อช่วยตัวคุณเองในการพิมพ์ในอนาคต:

git remote add <whatever-name> <url-of-other-repo>

จากนั้นคุณสามารถทำได้

git push --all <whatever-name>

หรือ

git fetch <whatever-name>

ขึ้นอยู่กับว่าคุณอยู่ใน repo ใดหาก<whatever-name>เป็นoriginเช่นนั้นคุณสามารถละทิ้งได้เลย

ข้อจำกัดความรับผิดชอบ: ฉันไม่ใช่กูรูด้านความรู้ ถ้าฉันพูดอะไรผิดฉันอยากจะรู้แจ้ง!

Update: อ่านคอมเม้น!


8
เมื่อฉันทำgit-fetch --allภายในที่เก็บเปล่าฉันไม่เห็นการอัปเดตที่ฉันทำกับที่เก็บหลัก แต่เมื่อผลักดันจาก repo หลักด้วยgit push --all <url-of-bare-repo>ฉันจะเห็นการอัปเดตในgit log. คงจะมีคำอธิบายง่ายๆสำหรับเรื่องนี้ - มีใครอธิบายได้บ้าง?
pho79

2
@ โทมัส - ใช่โดย "ไม่เห็น" ฉันหมายความว่าgit logไม่แสดงการอัปเดตเหล่านี้ในที่เก็บข้อมูลเปล่า (ไม่ทำgit log --allและไม่ทำ repo ที่ใช้งานได้ซึ่งสร้างขึ้นโดยการโคลน repo เปล่า - ไม่ว่าจะผ่านgit log --allหรือเพียงแค่ดูไฟล์ใหม่ที่ควรปรากฏที่นั่น) เป็นการทดสอบที่ค่อนข้างรวดเร็วเพื่อดูตัวคุณเอง ส่วนใหญ่ฉันแค่อยากรู้ว่าฉันขาดอะไรไป
pho79

73
หาก repo ที่อยู่ห่างไกลที่สุดของคุณคือ github ซึ่งคุณไม่มีสิทธิ์เข้าถึงไม่สามารถเรียกใช้ push ได้ ฯลฯ คุณสามารถทำได้git fetch -q origin master:masterภายใน repo เปล่าในพื้นที่ของคุณ สิ่งนี้จะดึงข้อมูลใหม่จากสาขาหลักของ github และอัปเดตสาขาหลักในพื้นที่ของคุณเป็น
Altreus

4
@Altreus Indeed master:masterคือสิ่งที่จำเป็นในการย้าย HEAD ไปข้างหน้าไปยัง repo ระยะไกล ในกรณีของฉันเนื่องจากมีปัญหาฉันไม่สามารถเชื่อมต่อกับ repo เปล่าของเราได้อีกต่อไปเพราะ git หายไป จนกว่าจะได้รับการแก้ไขฉันจะทำอุโมงค์ย้อนกลับและดึงไปที่ repo ส่วนกลางโดยใช้: git fetch ssh://localhost:8765/... master:masterและมันใช้งานได้ดี ขอบคุณ!
estani

4
@Altreus ถ้าอยากได้ทุกสาขาก็ทำได้git fetch origin *:*
JBert

71

ฉันสร้างที่เก็บโดยใช้คำสั่งต่อไปนี้

git clone --bare <remote_repo>

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

git clone --mirror <remote_repo>

จากนั้นฉันสามารถรันคำสั่งต่อไปนี้ในที่เก็บมิเรอร์เพื่อคว้าการอัปเดตของที่เก็บหลัก:

git fetch --all

ฉันเจอโซลูชันนี้โดยการอ่านMirror a Git Repository By Pulling


22
ในการเปลี่ยน bare repo ที่มีอยู่ให้เป็นมิเรอร์สิ่งที่คุณต้องทำคือเพิ่ม 2 บรรทัดในไฟล์ config git ที่ <REPO> .git / config ใน[remote "origin"]ส่วนเพิ่มfetch = +refs/*:refs/*และmirror = true
Isaac Betesh

@IsaacBetesh คุณช่วยวันของฉัน :)
smc

55

ทางออกเดียวที่นอกเหนือจากการสร้างด้วยgit clone --mirrorคือจากเกรเกอร์ :

git config remote.origin.fetch 'refs/heads/*:refs/heads/*'

จากนั้นคุณgit fetchจะเห็นการอัปเดต สิ่งที่แปลกคือก่อนหน้านี้แม้ว่าจะมีการremoteกำหนดค่าไว้ แต่ก็ไม่มีสาขาอยู่ในรายการgit branch -a.


1
สิ่งนี้ช่วยฉันได้จริงๆ! โครงการ Capistrano / repo ยังใช้การตั้งค่านี้เพื่ออนุญาตให้ซับคนเดียวgit remote updateทำงานได้
Minqi Pan

1
หากรีโมตมีการบังคับให้อัพเดตหรือลบสาขา (และคุณต้องการแสดงการเปลี่ยนแปลงเหล่านั้น) คุณอาจต้องเพิ่ม--forceและ--pruneตามลำดับในgit fetchบรรทัด
Elliott Slaughter

46

สมมติว่า:

$ git clone --bare https://github.com/.../foo.git

ดึงข้อมูลด้วย:

$ git --git-dir=foo.git fetch origin +refs/heads/*:refs/heads/* --prune

หมายเหตุ: --git-dir=foo.gitไม่จำเป็นหากคุณcdไปที่ไดเร็กทอรีก่อน


2
แม้ว่าฉันจะไม่ทราบว่าจะเกิดขึ้นเมื่อใดหากoriginไม่ได้กำหนดไว้คุณสามารถแทนที่originส่วนนั้นด้วย path / url ไปยังที่เก็บเดิมของคุณได้ตลอดเวลา เช่น$ git --git-dir=foo.git fetch https://github.com/.../foo.git +refs/heads/*:refs/heads/*
antak

นี่คือสิ่งที่ฉันกำลังมองหา สิ่งนี้ทำงานได้อย่างสมบูรณ์แบบ
Maxime Rouiller

13

หลังจากยุ่งมากฉันพบว่าสิ่งนี้เหมาะกับฉัน

ครั้งเดียว:

git clone --mirror ssh://git@source.address:2000/repo
git remote add remote_site ssh://git@remote_site.address/repo
git config remote.origin.fetch 'refs/heads/*:refs/heads/*'

ทุกครั้งที่ฉันต้องการซิงค์:

cd /home/myhome/repo.git
git --bare fetch ssh://git@source.address:2000/repo
git  fetch ssh://git@source.address:2000/repo
git push --mirror remote_site

7
บรรทัดที่สาม ( git config remote.origin.fetch 'refs/heads/*:refs/heads/*') คือกุญแจสำคัญ คำตอบที่ดีขอบคุณ!
peterh - คืนสถานะ Monica

2
อย่างที่ @peterh บอกไลน์git config remote.origin.fetch 'refs/heads/*:refs/heads/*'คือคำตอบ หลังจากกดปุ่มคำสั่งนี้ฉันสามารถทำได้git fetchและ repo จะซิงค์กับรีโมต
joker

3

เพิ่มพื้นที่เก็บข้อมูลเปลือยเป็นพื้นที่เก็บข้อมูลระยะไกล, git pushการใช้งานแล้ว


ดังนั้นถ้าฉันต้องการทำสิ่งนี้โดยไม่ต้องกดฉันไม่สามารถใช้ที่เก็บเปล่าและใช้ลิงก์สัญลักษณ์หรืออะไรทำนองนั้นได้?
ŠimonTóth

การกดเป็นวิธีการปกติในการถ่ายโอนเนื้อหาที่เก็บไปยังที่เก็บเปล่าโดยไม่จำเป็นต้องหลีกเลี่ยง
Philipp

2
คุณไม่สามารถผลักดันได้เสมอไป ตัวอย่างเช่นหาก bare อยู่ในเครือข่ายส่วนตัวและ repos หลักเป็นแบบสาธารณะ (บน GitHub สำหรับตัวอย่าง)
fanf42

0

สำหรับฉันชุดค่าผสมนี้ใช้งานได้:

git remote add remote_site https://github.com/project/repo.git
git fetch -u remote_site +refs/heads/*:refs/heads/*
git fetch -u remote_site +refs/tags/*:refs/tags/*
git push --mirror

จำเป็นต้องมีพารามิเตอร์ -u สำหรับการดึงข้อมูลมิฉะนั้นฉันจะได้รับข้อความแสดงข้อผิดพลาด: "การปฏิเสธที่จะดึงข้อมูลไปยังสาขาปัจจุบัน refs / head / master of non-bare repository" (ดูเพิ่มเติมที่https://stackoverflow.com/a/19205680/4807875 )

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