คุณใช้พื้นที่เก็บข้อมูล“ git --bare init” ได้อย่างไร


321

ฉันต้องการสร้างที่เก็บ Git ส่วนกลาง แต่ฉันสับสนเล็กน้อย ...

ฉันได้สร้างที่เก็บเปล่า (ในเซิร์ฟเวอร์ git ของฉัน, เครื่อง 2) ด้วย:

$ mkdir test_repo
$ git --bare init

ตอนนี้ฉันต้องส่งไฟล์จากที่เก็บในเครื่องของฉัน (เครื่อง 1) ไปยังที่เก็บเปล่า (เครื่อง 2) ฉันสามารถเข้าถึงเครื่อง 2 โดย SSH สิ่งที่ฉันคิดว่าฉันไม่เข้าใจแนวคิดของพื้นที่เก็บข้อมูลเปลือย ...

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

วิธีที่ถูกต้องในการมีที่เก็บส่วนกลางให้มีพื้นที่เก็บข้อมูลเปล่าหรือไม่?

ฉันสับสนเล็กน้อยในเรื่องนี้ โปรดบอกเบาะแสให้ฉัน

คำตอบ:


392

git init --bareประการแรกเพียงเพื่อตรวจสอบคุณจะต้องมีการเปลี่ยนแปลงลงในไดเรกทอรีที่คุณสร้างขึ้นก่อนที่จะใช้ .gitนอกจากนี้ก็เป็นธรรมดาที่จะให้เก็บเปลือยนามสกุล ดังนั้นคุณสามารถทำได้

git init --bare test_repo.git

สำหรับ Git เวอร์ชั่น <1.8 คุณต้องทำ

mkdir test_repo.git
cd test_repo.git
git --bare init

ที่จะตอบคำถามของคุณในภายหลังที่เก็บเปลือย (ตามคำนิยาม) ไม่ได้มีต้นทำงานที่แนบมากับพวกเขาดังนั้นคุณจึงไม่สามารถเพิ่มไฟล์ให้กับพวกเขาตามที่คุณต้องการในพื้นที่เก็บข้อมูลที่ไม่ได้เปลือยปกติ (เช่นกับและที่ตามมาgit add <file> git commit)

คุณเกือบจะอัพเดทที่เก็บเปลือยโดยการกดไปที่มัน (ใช้git push) จากที่เก็บอื่น

โปรดทราบว่าในกรณีนี้คุณจะต้องอนุญาตให้ผู้อื่นดันไปยังที่เก็บของคุณก่อน เมื่ออยู่ข้างในtest_repo.gitทำ

git config receive.denyCurrentBranch ignore

การแก้ไขโดยชุมชน

git init --bare --shared=group

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


7
นอกจากนี้คุณยังสามารถเพิ่ม--sharedตัวเลือกสำหรับinitถ้าคุณวางแผนที่จะให้คนอื่นผลักดันไปยัง repo นี้ มันจะเพิ่มการอนุญาตให้เขียนเป็นกลุ่มในที่เก็บ - ลิงค์
prasanthv

17
ฉันคิดว่าสามบรรทัดนี้มีผลเหมือนกันเพียงอันเดียวเท่านั้น: git --bare init test_repo.git อย่างน้อยในเวอร์ชัน git ปัจจุบันของฉัน (1.8.2.2)
Fran Marzoa

1
มีประโยชน์ถ้าคุณต้องการทราบความแตกต่างระหว่าง repos เปลือยและไม่ใช่เปลือยstackoverflow.com/questions/7861184/ …
Guille Acosta

git หาของได้อย่างไรถ้าต้นไม้ไม่ทำงาน ฉันคิดว่ามีต้นไม้ทำงานในที่เก็บวัตถุ git และนั่นคือสิ่งที่เวที SHAs ชี้และมุ่งมั่นชี้ไปที่
akantoword

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

246

ฉันกำลังเพิ่มคำตอบนี้เพราะหลังจากมาถึงที่นี่ (มีคำถามเดียวกัน) ไม่มีคำตอบใดที่อธิบายถึงขั้นตอนที่จำเป็นทั้งหมดที่ต้องดำเนินการจากสิ่งใดไปยัง repo ทางไกล (เปล่า) ที่ใช้งานได้อย่างสมบูรณ์

หมายเหตุ: ตัวอย่างนี้ใช้เส้นทางท้องถิ่นสำหรับตำแหน่งของ repo เปล่า แต่โปรโตคอล git อื่น ๆ (เช่น SSH ที่ระบุโดย OP) ควรใช้งานได้ดี

ฉันพยายามที่จะเพิ่มบันทึกย่อตามวิธีการสำหรับผู้ที่ไม่คุ้นเคยกับคอมไพล์

1. เริ่มต้น repo เปล่า ...

> git init --bare /path/to/bare/repo.git
Initialised empty Git repository in /path/to/bare/repo.git/

สิ่งนี้จะสร้างโฟลเดอร์ (repo.git) และเติมด้วยไฟล์ git ที่เป็น repo git มันยืน, repo นี้ไม่มีประโยชน์ - มันไม่เคยมีใครกระทำและที่สำคัญไม่มีสาขา แม้ว่าคุณสามารถคัดลอก repo นี้ได้ แต่คุณไม่สามารถดึงมันได้

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

2a สร้างโฟลเดอร์การทำงานใหม่ (ไม่มีไฟล์ที่มีอยู่) โดยการคัดลอก repo ที่ว่างเปล่า

git clone /path/to/bare/repo.git /path/to/work
Cloning into '/path/to/work'...
warning: You appear to have cloned an empty repository.
done.

คำสั่งนี้จะใช้งานได้หาก/path/to/workไม่มีอยู่หรือเป็นโฟลเดอร์ว่าง จดบันทึกคำเตือน - ในขั้นตอนนี้คุณยังไม่มีประโยชน์ใด ๆ หากคุณcd /path/to/workและวิ่งgit statusคุณจะได้รับสิ่งที่ชอบ:

On branch master

Initial commit

nothing to commit (create/copy files and use "git add" to track)

แต่นี่เป็นเรื่องโกหก คุณไม่ได้อยู่ในสาขาจริงๆmaster(เพราะgit branchไม่มีอะไรคืน) และจนถึงตอนนี้ก็ไม่มีข้อผูกมัดใด ๆ

จากนั้นคัดลอก / ย้าย / สร้างไฟล์บางไฟล์ในโฟลเดอร์ทำงานเพิ่มไปยังคอมไพล์และสร้างการคอมมิทครั้งแรก

> cd /path/to/work
> echo 123 > afile.txt
> git add .
> git config --local user.name adelphus
> git config --local user.email adelphus@example.com
> git commit -m "added afile"
[master (root-commit) 614ab02] added afile
 1 file changed, 1 insertion(+)
 create mode 100644 afile.txt

git configคำสั่งที่มีความจำเป็นเท่านั้น Git ถ้าคุณยังไม่ได้บอกแล้วว่าคุณเป็นใคร โปรดทราบว่าถ้าคุณเรียกใช้ตอนนี้git branchคุณจะเห็นmasterสาขาที่ระบุ ตอนนี้ทำงานgit status:

On branch master
Your branch is based on 'origin/master', but the upstream is gone.
  (use "git branch --unset-upstream" to fixup)

nothing to commit, working directory clean

นี่เป็นสิ่งที่ทำให้เข้าใจผิด - ต้นน้ำไม่ได้ "หายไป" แต่ยังไม่ได้สร้างและgit branch --unset-upstreamจะไม่ช่วย แต่ก็ไม่เป็นไรตอนนี้เรามีความมุ่งมั่นครั้งแรกของเราเราสามารถผลักดันและต้นแบบจะถูกสร้างขึ้นบน repo เปลือย

> git push origin master
Counting objects: 3, done.
Writing objects: 100% (3/3), 207 bytes | 0 bytes/s, done.
Total 3 (delta 0), reused 0 (delta 0)
To /path/to/bare/repo.git
 * [new branch]      master -> master

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

> git pull
Already up-to-date.
> git push origin master
Everything up-to-date

2b สร้างโฟลเดอร์ที่ใช้งานได้จากไฟล์ที่มีอยู่ หากคุณมีโฟลเดอร์ที่มีไฟล์อยู่แล้ว (ดังนั้นคุณจึงไม่สามารถคัดลอกได้) คุณสามารถเริ่มต้น repo git ใหม่เพิ่มคอมมิชชันแรกแล้วเชื่อมโยงไปยัง repo เปล่าหลังจากนั้น

> cd /path/to/work_with_stuff
> git init 
Initialised empty Git repository in /path/to/work_with_stuff
> git add .
# add git config stuff if needed
> git commit -m "added stuff"

[master (root-commit) 614ab02] added stuff
 20 files changed, 1431 insertions(+)
 create mode 100644 stuff.txt
...

ณ จุดนี้เรามีความมุ่งมั่นและสาขาหลักในท้องถิ่นซึ่งเราต้องเปลี่ยนเป็นสาขาอัปสตรีมที่ติดตามระยะไกล

> git remote add origin /path/to/bare/repo.git
> git push -u origin master
Counting objects: 31, done.
Delta compression using up to 4 threads.
Compressing objects: 100% (31/31), done.
Writing objects: 100% (31/31), 43.23 KiB | 0 bytes/s, done.
Total 31 (delta 11), reused 0 (delta 0)
To /path/to/bare/repo.git
 * [new branch]      master -> master
Branch master set up to track remote branch master from origin.

สังเกตการ-uตั้งค่าสถานะบน git push เพื่อตั้งค่า (ใหม่) สาขาอัปสตรีมที่ติดตาม เหมือนก่อนหน้านี้ตอนนี้เรามี repo เปลือยที่ใช้งานได้อย่างสมบูรณ์ซึ่งสามารถโคลนได้ที่อื่นในสาขาหลักเช่นเดียวกับสำเนาการทำงานในท้องถิ่นที่สามารถดึงและดัน

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


4
น่าสนใจ มีรายละเอียดมากกว่าคำตอบของฉันอย่างแน่นอน +1
VonC

13
คำตอบนี้แก้ปัญหาของฉันและควรเป็นคำตอบที่ยอมรับหวังว่าผู้คนมากขึ้นสามารถลงคะแนนได้
inix

11
คุณควรคิดเงินสำหรับคำตอบเช่นนี้
Arthur Tarasov

2
ในฐานะผู้ใช้คอมไพล์ใหม่คำตอบนี้มีประโยชน์กับฉันอย่างมากขอบคุณที่เขียนสิ่งนี้!
sidewinderguy

1
นี่คือคำตอบที่ยอดเยี่ยม จะช่วยให้หน่วยของเรามากขึ้น
wobsoriano

33

ตอบคำถามของคุณทีละคน:

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

คุณสามารถcommitไปที่ที่เก็บเปลือยได้โดยการpushไปที่ที่เก็บโคลนของคุณ มันไม่มีแผนผังการทำงานดังนั้นจึงไม่มีไฟล์ที่แก้ไขไม่มีการเปลี่ยนแปลง

การมีที่เก็บส่วนกลางวิธีเดียวที่จะมีที่bareเก็บคือ



20

การปฏิบัติทั่วไปคือการมีพื้นที่เก็บข้อมูลส่วนกลางที่คุณกดเป็น repo เปล่า

หากคุณมีพื้นหลัง SVN คุณสามารถเชื่อมโยง repo SVN กับ repo เปล่า Git ไม่มีไฟล์ใน repo ในรูปแบบดั้งเดิม ในขณะที่ธุรกรรมซื้อคืนในพื้นที่ของคุณจะมีไฟล์ที่สร้าง "รหัส" ของคุณเพิ่มเติม

คุณต้องเพิ่มรีโมตไปยัง repo ที่เปลือยจาก repo ในพื้นที่ของคุณและกด "code" ลงไป

มันจะเป็นสิ่งที่ชอบ:

git remote add central <url> # url will be ssh based for you
git push --all central

การใช้git remote add central <url>ในกรณีของ SSH จะรวมถึงเส้นทางด้วยหรือไม่ เช่นgit remote add central ssh://user@server/home/user/repo.git
ใช่ Barry

17

ควรจะเพียงพอ:

git remote add origin <url-of-bare-repo>
git push --all origin

ดูรายละเอียดเพิ่มเติม " GIT: ฉันจะอัพเดต repo เปล่าได้อย่างไร "
หมายเหตุ:

  • คุณสามารถใช้ชื่ออื่นที่ไม่ใช่ ' origin' สำหรับการอ้างอิงรีโมต repo แบบเปลือยได้
  • นี้จะไม่ผลักดันแท็กของคุณคุณต้องแยกgit push --tags originว่า

5

เป็นการดีที่จะตรวจสอบว่ารหัสที่คุณกดได้รับการยืนยันแล้ว

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

$ cd test_repo
$ git log --relative=/

นี่จะแสดงให้คุณเห็นการเปลี่ยนแปลงที่เกิดขึ้นราวกับว่านี่เป็น repo คอมไพล์ทั่วไป


5

ขึ้นอยู่กับคำตอบของ Mark Longair & Roboprog:

ถ้า git version> = 1.8

git init --bare --shared=group .git
git config receive.denyCurrentBranch ignore

หรือ :

ถ้า git version <1.8

mkdir .git
cd .git
git init --bare --shared=group 
git config receive.denyCurrentBranch ignore

คำสั่ง config นั้น: วิธีที่จะนำไปใช้กับไดเรกทอรี. git ที่คุณเพิ่งสร้างขึ้นได้อย่างไร
GreenAsJade

ฉันไม่แน่ใจว่าฉันเข้าใจคำถามของคุณหรือไม่ คุณจะแม่นยำมากขึ้น? เนื่องจากคุณมีพื้นที่เก็บข้อมูล git ของคุณเริ่มต้นคุณสามารถกำหนดค่าได้มากเท่าที่คุณต้องการด้วยคำสั่ง 'git config' ..
แจ็ค '

@GreenAsJade เป็นเพราะคุณยังอยู่ในโฟลเดอร์ของที่เก็บ git ดังนั้นจึงใช้กับมัน (ค่าเริ่มต้นของการกำหนดค่า git เป็นเหมือนตัวเลือก - local)
BlueCoder

2

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

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

ทั้งที่เก็บโลคัลในเครื่อง 1 และที่เก็บ 'คัดลอก' ในเครื่อง 2 นั้นไม่ได้เป็นไฟล์เปล่า ความสัมพันธ์ระหว่างที่เก็บข้อมูลเปลือยและที่ไม่ใช่เปลือย

บล็อกจะช่วยให้คุณเข้าใจ https://www.atlassian.com/git/tutorials/setting-up-a-repository


0

คุณสามารถดำเนินการคำสั่งต่อไปนี้เพื่อเริ่มต้นพื้นที่เก็บข้อมูลในท้องถิ่นของคุณ

mkdir newProject
cd newProject
touch .gitignore
git init
git add .
git commit -m "Initial Commit"
git remote add origin user@host:~/path_on_server/newProject.git
git push origin master

คุณควรทำงานในโครงการของคุณจากที่เก็บในเครื่องของคุณและใช้เซิร์ฟเวอร์เป็นที่เก็บส่วนกลาง

คุณสามารถติดตามบทความนี้ซึ่งอธิบายทุกแง่มุมของการสร้างและบำรุงรักษาที่เก็บ Git Git สำหรับผู้เริ่มต้น

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