Git โคลนโดยไม่ต้องไดเรกทอรี. git


144

มีค่าสถานะที่จะส่งผ่านไปยังgitเมื่อทำการโคลนหรือไม่อย่าโคลน.gitไดเรกทอรี? ถ้าไม่วิธีการเกี่ยวกับการตั้งค่าสถานะการลบ.gitไดเรกทอรีหลังจากโคลน


41
คำถามนี้เป็นคำถามไม่ได้ล่อของวิธีการทำ "การส่งออกคอมไพล์" (เช่น "การส่งออก SVN") คำถามนี้ถามเกี่ยวกับวิธีการโคลน A (ระยะไกล) พื้นที่เก็บข้อมูลได้โดยไม่ต้อง.gitไดเรกทอรี dupe ที่ถูกกล่าวหาจะถามวิธีส่งออกที่เก็บข้อมูลที่มีอยู่ซึ่งคุณมี.gitไดเรกทอรีอยู่แล้ว
mknaf

3
ตกลง. คุณไม่สามารถgit archiveพื้นที่เก็บข้อมูลระยะไกลเป็นวิธีการแก้ปัญหา "ซ้ำกันได้"
Vladislav Rastrusny

คำตอบ:


214

ใช้

git clone --depth=1 --branch=master git://someserver/somerepo dirformynewrepo
rm -rf ./dirformynewrepo/.git
  • ตัวเลือกความลึกจะทำให้แน่ใจว่าได้คัดลอกประวัติน้อยที่สุดเพื่อรับ repo
  • ตัวเลือกสาขาเป็นทางเลือกและหากไม่ได้ระบุจะได้รับข้อมูลหลัก
  • บรรทัดที่สองจะทำให้ไดเรกทอรีของคุณdirformynewrepoไม่ใช่ที่เก็บ Git อีกต่อไป
  • หากคุณกำลังทำซ้ำ submodule โคลนความลึกและพารามิเตอร์สาขาไม่ได้ใช้กับ submodule

19
สิ่งที่ไม่!$/.gitหมายถึง?
Jürgen Paul

15
สำหรับผู้ที่สนใจมันเป็นหนึ่งในนักออกแบบคำซึ่งเป็นส่วนหนึ่งของคุณสมบัติการขยายประวัติใน Bash และ zsh
Rufflewind

มีวิธีในการรับความลึก = 1 ของทุกสาขาใน repo หรือไม่? ไม่ใช่แค่ผู้เชี่ยวชาญหรือสาขาที่กำหนด
Gayan Pathirage

2
คุณทำเช่นนั้นด้วยตัวเลือก --no-single-branch เนื่องจาก --depth บอกถึง - single-branch คุณสามารถยกเลิกการแปลได้ด้วย - no-single-branch (ถ่ายจากหน้าคนโคลนคอมไพล์)
Robert Stoddard

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

29

เนื่องจากคุณต้องการไฟล์เท่านั้นคุณไม่จำเป็นต้องถือเป็น repo คอมไพล์

rsync -rlp --exclude '.git' user@host:path/to/git/repo/ .

และใช้งานได้กับโลคัลพา ธ และพา ธ ssh / rsync ระยะไกลเท่านั้นมันอาจไม่ทำงานหากเซิร์ฟเวอร์ระยะไกลให้การเข้าถึงแบบ git: // หรือ https: // เท่านั้น


ที่จะไม่พิจารณา. gignignore?
JJ Roman

itub ถูกต้องนี่เป็นเพียงการคัดลอกแผนผังงาน git checkout ใช้ในการทำอย่างถูกต้องตอนนี้มันไม่ได้อีกต่อไป
Sylvain

ดังนั้นคุณจะทำอย่างไรถ้าเซิร์ฟเวอร์ให้การเข้าถึงแบบ git: // เท่านั้น
Rainb

3

อีกทางเลือกหนึ่งถ้าคุณติดตั้งNode.jsคุณสามารถใช้คำสั่งต่อไปนี้:

npx degit GIT_REPO

npxมาพร้อมกับ Node และอนุญาตให้คุณเรียกใช้แพคเกจที่ใช้โหนดฐานสองโดยไม่ต้องติดตั้งชุดแรก (หรือคุณสามารถติดตั้งได้degitทั่วโลกโดยใช้npm i -g degit)

Degitเป็นเครื่องมือที่สร้างโดย Rich Harris ผู้สร้าง Svelte และ Rollup ซึ่งเขาใช้ในการสร้างโครงการใหม่อย่างรวดเร็วโดยการโคลนที่เก็บโดยไม่ต้องเก็บโฟลเดอร์ git แต่มันสามารถใช้ในการโคลน repo ครั้งเดียว ...


-1

คุณสามารถทำได้

git clone git://repo.org/fossproject.git && rm -rf fossproject/.git

44
ดาวน์โหลดทุกอย่างและลบ dir ในภายหลังหรือไม่ เช่น emacs มี 95% ของ 1GB ใน. git ดังนั้น --depth = 1 เป็นวิธีแก้ปัญหาที่นี่อย่างชัดเจน
RParadox

1
ฉันยังเห็นโฟลเดอร์. git เมื่อฉันทำ depth = 1
Aryeh Armon

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