คอมไพล์ git ผ่าน ssh


233

ฉันมีโครงการที่ฉันสร้างที่เก็บ git:

$ cd myproject  
$ git init  
$ git add .  
$ git commit  

ฉันต้องการสร้างโคลนเปล่าบนเครื่องอื่น:

$ cd ..  
$ git clone --bare myproject  ssh://user@server:/GitRepos/myproject.git  

ฉันดำเนินการโคลน แต่ไม่ได้พิมพ์คำตอบใด ๆ ฉันล็อกออนเข้าสู่เครื่องเซิร์ฟเวอร์และพยายามดูว่าไฟล์ถูกจัดเก็บอย่างไร เส้นทาง / GitRepos ว่างเปล่าดังนั้นฉันตัดสินใจทำการโคลนอีกครั้ง:

$ git clone --bare myproject  ssh://user@server:/GitRepos/myproject.git

เวลานี้คำตอบคือ:

ร้ายแรง: เส้นทางปลายทาง 'ssh: // user @ server: /GitRepos/myproject.git' มีอยู่แล้วและไม่ใช่ไดเรกทอรีว่างเปล่า

แต่ฉันเห็นว่าเส้นทางนั้นว่างเปล่า
เกิดอะไรขึ้นที่นี่ ?


ฉันไม่คิดว่าการวิ่งgit clone --bareจะทำในสิ่งที่คุณคิดว่ามันจะทำ
Wolfer

3
สำหรับฉันแล้ว ssh: // สร้างโฟลเดอร์แทนที่จะใช้โปรโตคอลระยะไกล มีสิ่งที่จะทำงานโดยใช้คำตอบของ @ alec-the-geek คุณช่วยเลือกคำตอบที่ต้องการสำหรับงานนี้ได้ไหม
akauppi

1
@akauppi: มันเป็นความรับผิดชอบของ OP ที่จะต้องพิจารณาคำตอบทั้งหมด แต่พวกเขาไม่มีภาระผูกพันในการเลือกคำตอบจนกว่าพวกเขาจะพอใจ (แน่นอนมันไม่เจ็บที่จะเตือนพวกเขาหรือถามข้อมูลเพิ่มเติมที่พวกเขาต้องการสำหรับคำตอบที่เป็นที่ยอมรับสำหรับพวกเขา!)
jvriesem

@ jvriesem แน่นอน จะลบ "เป็นงานของคุณ" ตอนนี้ แต่มันเป็นของเก่า ... :)
akauppi

คำตอบ:


219

สิ่งนี้อาจไม่เกี่ยวข้องโดยตรงกับคำถาม แต่มีข้อผิดพลาดอย่างหนึ่งที่ฉันเพิ่งทำด้วยตัวเองและฉันเห็นใน OP คือข้อกำหนด URL ssh://user@server:/GitRepos/myproject.git- กล่าวคือคุณมีทั้งโคลอน:และเครื่องหมายสแลช/หลังจากที่บ่งบอกเส้นทางที่แน่นอน

ฉันพบGit clone แล้ว ssh: ไม่สามารถแก้ไขชื่อโฮสต์ - git, development - Nicolas Kuttler (ซึ่งเป็นข้อผิดพลาดที่ฉันได้รับในgitเวอร์ชั่น 1.7.9.5) โดยสังเกตว่า:

ปัญหาเกี่ยวกับคำสั่งที่ฉันใช้ตอนแรกคือฉันพยายามใช้ไวยากรณ์เหมือน scp

... ซึ่งเป็นปัญหาของฉันด้วย! ดังนั้นโดยทั่วไปในการgitที่มีsshการใช้งานคุณทั้งสอง

  • ssh://username@host.xz/absolute/path/to/repo.git/ - เป็นเครื่องหมายสแลชสำหรับพา ธ สัมบูรณ์บนเซิร์ฟเวอร์
  • username@host.xz:relative/path/to/repo.git/- เครื่องหมายโคลอน (ต้องไม่มีssh://เส้นทางสัมพัทธ์บนเซิร์ฟเวอร์ (เทียบกับโฮม dir ของusernameบนเครื่องเซิร์ฟเวอร์)

หวังว่านี่จะช่วยใครซักคน
ไชโย!


84
มันใช้งานไม่ได้ หากคุณต้องการระบุพา ธ สัมพัทธ์กับ ssh คุณจะต้องสูญเสียssh://คำนำหน้า ฉันแค่ใช้เวลา 20 นาทีเพื่อหาสิ่งนี้ git clone username@host.xz:relative/path/to/repo.git/ควรทำงาน.
bobbaluba

2
พยายามใช้คอมไพล์ 2.1.4 กับเดเบียน 8 ไม่ว่าการกระทำใด ๆ จะไม่เกิดขึ้น ไม่มีการสร้างไดเรกทอรีภายใต้ / GitRepos ในความพยายามครั้งแรกและในครั้งที่ 2 บ่นว่าเส้นทางนั้นมีอยู่แล้ว เช่นเดียวกับปัญหาดั้งเดิมที่รายงาน
dlsa

5
เนื่องจากความคิดเห็นของคุณ @bobbaluba (และคำตอบที่อัปเดตแล้ว) ฉันจึงไม่ต้องใช้เวลา 20 นาทีในการทำเช่นนี้ ขอบคุณ!
olafure

143

สำหรับที่เก็บบน GitHub ให้ลอง:

git clone ssh://git@github.com/<user>/<repository name>.git

สำหรับการตั้งค่าคอมไพล์เพื่อโคลนผ่าน ssh ดู:


<user> ชื่อผู้ใช้ของฉันใน Github หรือที่อยู่อีเมลของฉันสำหรับ GitHub คืออะไร? เนื่องจากลิงก์นี้แนะนำให้ฉันใช้ที่อยู่อีเมลในระหว่างการสร้างรหัสสาธารณะ help.github.com/th/github/authenticating-to-github/หลังจากลองแล้ว (ข้อความรหัสผ่านว่างสำหรับคีย์รหัส ssh) ฉันยังคงไม่สามารถคัดลอก repo จาก github ได้ ป.ล. ฉันไม่ได้เพิ่มกุญแจลงในตัวแทน
Minnie

งานเดียวกันสำหรับ gitlab ด้วย ก่อนหน้านั้นเราจำเป็นต้องเปิดใช้งานการตั้งค่าคีย์ SSH ตามที่คุณแนะนำ
Venkataraman R

45

คุณต้องเรียกใช้คำสั่ง clone ในสิ่งที่คุณเรียกใช้เซิร์ฟเวอร์ แต่ฉันคิดว่าคุณไม่ได้ใช้เซิร์ฟเวอร์ ssh กับลูกค้าในพื้นที่ของคุณเพื่อที่จะไม่ทำงาน แนะนำให้คุณทำตามวิธีนี้ (ตรวจสอบคู่มือ 'เพราะฉันทำสิ่งนี้จากหน่วยความจำ)

  1. ล็อกอินเข้าสู่เครื่องเซิร์ฟเวอร์
  2. สร้าง repo เปล่าโดยใช้ git init --bare
  3. บนเครื่องไคลเอ็นต์คุณสามารถพุช repo ของคุณไปยังเซิร์ฟเวอร์ git remote add origin ssh://user@server:/GitRepos/myproject.gitติดตามโดยgit push origin master

คำแนะนำที่ดี! หมายเหตุบางประการสำหรับผู้มาใหม่ (เช่นฉัน) ที่ไม่ได้จัดการกับ pure-server-git-folder มาก่อน: 2. cd / GitRepos; mkdir myproject.git; cd myproject.git ก่อน git init --bare คุณจะไม่ได้รับสำเนาการทำงานที่นี่ - ไฟล์ repo และโฟลเดอร์ (ปกติเป็น. git) จะถูกเปิดเผยออกมาสำหรับคุณดังนั้นชื่อของการตั้งค่าสถานะ ขอบคุณ
akauppi

2
"git init --bare" ไม่ได้สร้างไดเรกทอรี. git มันทำให้ไฟล์โดยตรงในโฟลเดอร์ เมื่อเพิ่มที่มาระยะไกลฉันจะได้รับ: "" ร้ายแรง: ไม่ใช่ที่เก็บ git (หรือพาเรนต์จนถึงจุดเชื่อมต่อ / โฮม) หยุดที่ขอบเขตของระบบไฟล์ (GIT_DISCOVERY_ACROSS_FILESYSTEM)
dlsa

10

คำเตือน: นี่เป็นเพียงสำเนาของความคิดเห็นโดยbobbalubaทำให้มองเห็นได้มากขึ้นสำหรับผู้เข้าชมในอนาคต มันช่วยฉันได้มากกว่าคำตอบอื่น ๆ


คุณต้องวางssh://คำนำหน้าเมื่อใช้git cloneเป็นตัวอย่าง

git clone git@github.com:owner/repo.git

5

ลองนี้

ขั้นตอนที่ 1:

ls -al ~/.ssh

ป้อนคำอธิบายรูปภาพที่นี่

ขั้นตอนที่ 2:

ssh-keygen 

(ใช้ปุ่ม Enter สำหรับค่าเริ่มต้น) ป้อนคำอธิบายรูปภาพที่นี่ ขั้นตอนที่ 3: การตั้งค่าไฟล์กำหนดค่า

vim /c/Users/Willie/.ssh/config

โฮสต์ gitlab.com
ชื่อโฮสต์ gitlab.com
ผู้ใช้ git
IdentityFile ~ / .ssh / id_rsa

ขั้นตอนที่ 4:

git clone git@gitlab.com:<username>/test2.git

ป้อนคำอธิบายรูปภาพที่นี่

ขั้นตอนที่ 5:
เมื่อคุณเสร็จสิ้นขั้นตอนที่ 4
1. ไฟล์ test2.git จะถูกดาวน์โหลดเสร็จแล้ว
2. คุณจะได้รับไฟล์ใหม่ (known_hosts) ใน ~ / .ssh
ป้อนคำอธิบายรูปภาพที่นี่

PS: ฉันสร้าง id_rsa และ id_rsa.ub ด้วยตนเองและฉันส่งไปยังเซิร์ฟเวอร์ Gitlab ใช้ทั้งสองปุ่มเพื่อด้านลูกค้า (windows และ Linux)


4

Git 101:

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

ดังนั้นเพื่อให้ได้ "เซิร์ฟเวอร์" ที่ใช้งานคุณจำเป็นต้องเรียกใช้git init --bare <your_project>.gitเนื่องจากจะสร้างพื้นที่เก็บข้อมูลว่างเปล่าซึ่งคุณสามารถนำเข้าบนเครื่องของคุณโดยไม่ต้องโคลนในไฟล์ปรับแต่งใน.git dir

หลังจากนี้คุณสามารถโคลน repo บนไคลเอนต์ของคุณตามที่ควรจะทำงาน แต่ฉันพบว่าลูกค้าบางคน (กล่าวคือgit-gui) จะไม่สามารถโคลน repo ที่ว่างเปล่าโดยสิ้นเชิง cd <your_project>.git && touch <some_random_file> && git add <some_random_file> && git commit && git push origin masterการทำงานรอบนี้คุณจำเป็นต้องใช้ (โปรดทราบว่าคุณอาจต้องกำหนดค่าชื่อผู้ใช้และอีเมลของคุณสำหรับคอมไพล์ของเครื่องนั้นหากคุณไม่เคยทำมาก่อนคำสั่งจริงที่จะเรียกใช้จะอยู่ในข้อความแสดงข้อผิดพลาดที่คุณได้รับ

git clone <user>@<server>:<relative_path><your_project>.gitดังนั้นในจุดนี้คุณสามารถโคลนพื้นที่เก็บข้อมูลไปยังเครื่องใดก็ได้เพียงแค่ทำงาน (ตามที่คนอื่น ๆ ได้ชี้ให้เห็นคุณอาจต้องนำหน้าด้วยssh://หากคุณใช้เส้นทางสัมบูรณ์) ซึ่งถือว่าคุณสามารถเข้าสู่ระบบจากไคลเอนต์ของคุณไปยังเซิร์ฟเวอร์แล้ว (นอกจากนี้คุณยังจะได้รับคะแนนโบนัสสำหรับการตั้งค่าไฟล์กำหนดค่าและปุ่มสำหรับsshหากคุณต้องการส่งข้อมูลจำนวนมากไปยังเซิร์ฟเวอร์ระยะไกล)

ลิงก์ที่เกี่ยวข้องบางอัน:
สิ่งนี้บอกสิ่งที่คุณต้องรู้
และนี่คือสำหรับผู้ที่รู้การทำงานพื้นฐานของ git แต่บางครั้งก็ลืมไวยากรณ์ที่แน่นอน


ลิงก์ทั้งสองตอนนี้ดูเหมือนว่าจะตายหรือไม่แสดงสิ่งที่คุณคาดหวัง
ทอดด์

2

ฉันต้องการลองคำตอบที่รวมถึง git-flow และ 'points' หรือ use-cases สามรายการพื้นที่เก็บข้อมูลส่วนกลาง git การพัฒนาในท้องถิ่นและเครื่องผลิต นี้ไม่ได้รับการทดสอบอย่างดี

ฉันกำลังให้คำสั่งที่เฉพาะเจาะจงอย่างไม่น่าเชื่อ แทนที่จะพูดว่าฉันจะบอก<your folder> สถานที่เดียวที่ฉันกำลังเปลี่ยนแปลงคำสั่งเดิมจะเปลี่ยนชื่อเซิร์ฟเวอร์เฉพาะของฉันด้วย/root/git example.comฉันจะอธิบายวัตถุประสงค์ของโฟลเดอร์เพื่อให้คุณสามารถปรับได้ตามต้องการ โปรดแจ้งให้เราทราบถึงความสับสนใด ๆ และฉันจะอัปเดตคำตอบ

เวอร์ชัน git บนเซิร์ฟเวอร์คือ 1.7.1 เซิร์ฟเวอร์คือ CentOS 6.3 (สุดท้าย)

เวอร์ชัน git บนเครื่องพัฒนาคือ 1.8.1.1 นี่คือ Mac OS X 10.8.4

ที่เก็บส่วนกลางและเครื่องผลิตอยู่ในเครื่องเดียวกัน

พื้นที่เก็บข้อมูลส่วนกลางซึ่งผู้ใช้ svn สามารถเกี่ยวข้องกับเป็น 'เซิร์ฟเวอร์' มีการกำหนดค่าดังต่อไปนี้ ฉันมีโฟลเดอร์/root/gitที่ฉันเก็บที่เก็บคอมไพล์ของฉันทั้งหมด ฉันต้องการสร้างพื้นที่เก็บข้อมูลคอมไพล์สำหรับโครงการที่ฉันเรียกว่า "ดอกไม้"

cd /root/git
git clone --bare flowers flowers.git

คำสั่ง git ให้สองข้อความ:

Initialized empty Git repository in /root/git/flowers.git/
warning: You appear to have cloned an empty repository.

ไม่มีอะไรต้องกังวล.

บนเครื่องพัฒนามีการกำหนดค่าดังต่อไปนี้ ฉันมีโฟลเดอร์/home/kinjal/Sitesที่ใส่โครงการทั้งหมดของฉัน ตอนนี้ฉันต้องการรับพื้นที่เก็บข้อมูล git กลาง

cd /home/kinjal/Sites
git clone root@example.net:/root/git/flowers.git

นี่ทำให้ฉันถึงจุดที่ฉันสามารถเริ่มเพิ่มสิ่งต่าง ๆ ลงไป ฉันตั้งค่า flow git ก่อน

git flow init -d

developโดยค่าเริ่มต้นนี้อยู่บนกิ่งไม้ ฉันเพิ่มรหัสของฉันที่นี่ตอนนี้ จากนั้นฉันต้องส่งไปยังที่เก็บ git ส่วนกลาง

git add .
git commit -am 'initial'
git push

เมื่อมาถึงจุดนี้มันผลักไปที่สาขาพัฒนา ฉันต้องการเพิ่มสิ่งนี้ในสาขาหลักด้วย

git flow release start v0.0.0 develop
git flow release finish v0.0.0
git push

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

บนไซต์การผลิตซึ่งอยู่บนเครื่องเดียวกับที่เก็บ git ส่วนกลางของฉันฉันต้องการวางที่เก็บ/var/www/vhosts/example.netไว้ /var/www/vhostsผมมีอยู่แล้ว

cd /var/www/vhosts
git clone file:///root/git/flowers.git example.net

หากเครื่องที่ผลิตจะอยู่ในเครื่องที่แตกต่างกันgit cloneคำสั่งจะมีลักษณะเหมือนกับที่ใช้กับเครื่องพัฒนา


1

ตรงไปตรงมาฉันขาดทักษะ GIT ของฉันเล็กน้อย

นั่นคือการโคลนที่เก็บข้อมูลเปลือยบนเครื่องของคุณซึ่งมีเฉพาะโฟลเดอร์.gitซึ่งเป็นไดเรกทอรีที่ซ่อนอยู่ ดำเนินการls -alและคุณควรเห็น.gitหรือcd .gitภายในพื้นที่เก็บข้อมูลของคุณ

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


ฉันตีความคำสั่งผิด สิ่งที่ฉันทำคือการสร้างแผนผังย่อย ssh: /myproject.git ภายใต้ไดเรกทอรีปัจจุบัน ฉันคิดว่าฉันถูกโคลนไปยังไดเรกทอรีระยะไกล แต่สิ่งที่คำสั่งทำจริงๆคือการโคลนจากพื้นที่เก็บข้อมูล
dlsa

0

ฉันทำ: git clone --bare "/ GITREPOSITORIES / RepoA" "ssh: // luc @ EERSTENASDS119J / volume1 / RepoA" ผลลัพธ์: ร้ายแรง: เส้นทางปลายทาง 'ssh: // luc @ EERSTENASDS119J / เล่ม 1 / RepA' มีอยู่แล้วและเป็น ไม่ใช่ไดเรกทอรีว่างเปล่า

ระบบสร้างไดเรกทอรี ssh: // luc @ EERSTENASDS119J / volume1 / RepoA ในเส้นทางปัจจุบันของฉัน

ดังนั้น git clone จึงไม่ตีความข้อกำหนด URL ใช้วิธีแก้ปัญหาของอเล็กซ์


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