Git Clone: ​​เพียงแค่ไฟล์โปรด?


141

ฉันต้องการโคลน repo GIT และไม่ท้ายด้วย.gitไดเรกทอรี ในคำอื่น ๆ ที่ฉันต้องการไฟล์ มีวิธีทำเช่นนี้หรือไม่?

git clone --no-checkoutทำตรงข้ามกับสิ่งที่ฉันต้องการ (ให้.gitไดเรกทอรี)

ฉันพยายามที่จะทำเช่นนั้นสำหรับrepo ระยะไกลไม่ใช่คนในพื้นที่ซึ่งหมายความว่านี่ไม่ใช่การซ้ำซ้อนของ " วิธีการทำ" ส่งออก git "(เช่น" ส่งออก svn ") " (แม้ว่าโซลูชันอาจจบลงด้วยการเป็น เหมือนกัน).



@Greg Hewgill ฉันพยายามทำเช่นนี้จาก repo ระยะไกล ไม่แน่ใจว่านั่นทำให้คำถามนี้ไม่เหมือนใครหรือไม่
Dan Rosenstark

1
แม้ว่านี่จะเป็นคำถามที่ใหม่กว่า แต่ฉันคิดว่านี่คุ้มค่าที่จะลองดู: stackoverflow.com/questions/11497457/…
eonil

1
ดูคำตอบอัปเดตของฉัน: git archiveตอนนี้ (Q4 2017) มีความแม่นยำมากขึ้นและจะไม่รวมโฟลเดอร์ว่าง
VonC

1
ยินดี. ดูเหมือนว่าความคิดเห็นของคุณจะถูกตั้งค่าสถานะและลบออก ... chat.stackoverflow.com/transcript/134259?m=39402889#39402889
VonC

คำตอบ:


75

git archiveคำสั่งคอมไพล์ที่จะใกล้เคียงที่สุดจากสิ่งที่คุณกำลังมองหาจะได้โดยการ
ดูการสำรองข้อมูลโครงการที่ใช้ git : มันจะรวมอยู่ในไฟล์ทั้งหมดที่เก็บถาวร (รวมถึง submodules ถ้าคุณใช้git-archive-allสคริปต์)

จากนั้นคุณสามารถใช้การเก็บถาวรนั้นได้ทุกที่ให้เฉพาะไฟล์และ.gitไดเรกทอรี

git archive --remote=<repository URL> | tar -t

หากคุณต้องการโฟลเดอร์และไฟล์จากระดับแรก:

git archive --remote=<repository URL> | tar -t --exclude="*/*"

ในการแสดงรายการเฉพาะโฟลเดอร์ระดับแรกของ repo ระยะไกล:

git archive --remote=<repository URL> | tar -t --exclude="*/*" | grep "/"

หมายเหตุ: ใช้ไม่ได้กับ GitHub (ไม่รองรับ)

ดังนั้นคุณจะต้องโคลน (ตื้นเพื่อเร่งขั้นตอนการโคลน) และเก็บถาวรในเครื่อง :

git clone --depth=1 git@github.com:xxx/yyy.git
cd yyy
git archive --format=tar aTag -o aTag.tar

ตัวเลือกอื่นจะทำการโคลนแบบตื้น (ดังที่กล่าวไว้ด้านล่าง) แต่ค้นหาโฟลเดอร์. git ที่อื่น

git --git-dir=/path/to/another/folder.git clone --depth=1 /url/to/repo

.gitซื้อคืนภาคโฟลเดอร์จะรวมเฉพาะไฟล์โดยไม่ต้อง

หมายเหตุ: git --git-dir ตัวเลือกในการที่คำสั่งgitgit cloneไม่ได้


ปรับปรุงกับ Git 2.14.X / 2.15 (ไตรมาสที่ 4 ปี 2017): มันจะให้แน่ใจว่าจะหลีกเลี่ยงการเพิ่มโฟลเดอร์ว่าง

" git archive" โดยเฉพาะอย่างยิ่งเมื่อใช้กับพา ธ สเปคเก็บไดเรกทอรีว่างไว้ในผลลัพธ์แม้ว่า Git จะไม่ทำเช่นนั้น
สิ่งนี้ได้รับการแก้ไขแล้ว

ดูกระทำ 4318094 (12 กันยายน 2017) โดยRené Scharfe ( ``)
แนะนำโดย: เจฟฟ์คิง (peff )
(รวมโดยJunio C Hamano - gitster-ในการกระทำ 62b1cb7 , 25 กันยายน 2017)

archive: อย่าเพิ่มไดเรกทอรีว่างลงในไฟล์เก็บถาวร

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

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


4
สิ่งนี้ใช้ได้สำหรับฉัน ฉันจะเพิ่มอีกหนึ่งสิ่ง หากคุณไม่สนใจโฟลเดอร์. git เลยฉันจะใช้คำสั่งนี้:git --git-dir=/dev/null clone --depth=1 /url/to/repo
HumanSky

นี่ไม่ได้ลบโฟลเดอร์. git
aliasav

@VonC ฉันพยายาม: git --git-dir = / dev / null clone --depth = 1 / url / to / repo
aliasav

1
วิ่งgit archive --remote=https://github.com/pornel/dssim.git @ | tar -tได้tar: This does not look like a tar archiveแล้ว มันใช้งานไม่ได้กับ GitHub เหรอ? นอกจากนี้สิ่งที่@หมายความว่าอย่างไร
André Werlang

2
@ AndréWerlang 7 ปีต่อมา ... ฉันไม่แน่ใจเหมือน@กัน: ฉันลบมันแล้ว นอกจากนี้ GitHub ยังไม่สนับสนุนรีโมทgit archive: ฉันได้แก้ไขคำตอบเพื่อเสนอทางเลือกอื่น
VonC


42

คุณสามารถสร้างโคลนตื้น ๆ เพื่อรับการแก้ไขเพียงไม่กี่ครั้งล่าสุด:

 git clone --depth 1 git://url

จากนั้นเพียงแค่ลบไดเรกทอรี. git หรือใช้git archiveเพื่อส่งออกต้นไม้ของคุณ


วิธีป้องกันข้อผิดพลาดนี้เมื่อฉันอัปเดตโดยการทำซ้ำโคลน: "ร้ายแรง: เส้นทางปลายทาง 'XYZ' มีอยู่แล้วและไม่ใช่ไดเรกทอรีว่างเปล่า"
Sohail Si

1
@SohailSi: โคลนไปยังตำแหน่งใหม่หรือลบไดเรกทอรีเก่า คุณน่าจะดีกว่าเพียงดึงการแก้ไขใหม่หากคุณต้องการอัพเดตสำเนาในเครื่องของคุณ
knittl

3

ทำไมไม่ทำการโคลนแล้วลบ.gitไดเรกทอรีเพื่อให้คุณมีสำเนาการทำงานเปล่า?

แก้ไข: หรืออันที่จริงทำไมใช้โคลนเลย? มันค่อนข้างสับสนเมื่อคุณบอกว่าคุณต้องการ repo คอมไพล์ แต่ไม่มี.gitไดเรกทอรี หากคุณหมายถึงว่าคุณต้องการเพียงแค่สำเนาของต้นไม้บางต้นทำไมไม่ทำcp -Rในเปลือกแทนที่จะลอกเลียนแบบคอมไพล์แล้วลบทิ้งใน.gitภายหลัง


ขอบคุณสำหรับสิ่งนั้น ไฟล์อยู่ใน repo คอมไพล์ ฉันหวังว่าจะสามารถสั่งให้ผู้ใช้ Mac ได้รับสำเนาของ repo ในหนึ่งบรรทัดโดยไม่ต้องกลายเป็น repo GIT
Dan Rosenstark

คุณไม่ควรมีคนรับรหัสโดยตรงจาก repo หากพวกเขาไม่สามารถใช้งานได้ (เช่นไม่มีที่เก็บ Git)
ทางเลือก

@Amoss ปล่อยทาร์บอลเพื่อให้ผู้คนไม่ได้ใช้รหัสล่าสุดอยู่เสมอ?
ทางเลือก

1
@ คณิตศาสตร์: และปล่อย tarball คุณต้องมีวิธีในการรับสำเนาการทำงานที่สะอาดออกจากพื้นที่เก็บข้อมูล - ซึ่งเป็นคำถามที่ถูกวาง
Andrew

1
การอ่านคำตอบด้านล่างแล้วทำ googling นิดหน่อยนำไปสู่คำถามอื่น: stackoverflow.com/questions/160608/…ถ้าคุณดูที่การใช้งานไฟล์เก็บถาวร git - ลบแล้วมันก็ทำสิ่งที่คุณ (และโปสเตอร์ต้นฉบับ ) กำลังมองหา. แก้ไข: ซึ่งเป็นสิ่งที่จอนตอบลดลง
แอนดรู

2

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


5
นั่นคือสิ่งที่ฉันถาม: วิธีการทำกับ git ... ฉันสามารถบอกได้ว่าไม่มีวิธีที่จะทำมันจากคำตอบที่ฉันได้รับ ขอขอบคุณ!
Dan Rosenstark

2

git checkout -f

มีวิธีการทำเช่นนี้โดยแยก repo จากต้นไม้ทำงาน

วิธีนี้มีประโยชน์หากคุณต้องการอัปเดตไฟล์ git-less git เหล่านี้เป็นประจำ ตัวอย่างเช่นฉันใช้มันเมื่อฉันต้องการตรวจสอบไฟล์ต้นฉบับและสร้างสิ่งประดิษฐ์จากนั้นคัดลอกสิ่งประดิษฐ์ลงใน repo อื่นสำหรับการปรับใช้กับเซิร์ฟเวอร์และฉันยังใช้มันเมื่อผลักซอร์สโค้ดไปยังเซิร์ฟเวอร์เมื่อฉันต้องการ รหัสที่มาเพื่อชำระเงินและสร้างลงในไดเรกทอรี www

เราจะสร้างสองโฟลเดอร์หนึ่งโฟลเดอร์สำหรับคอมไพล์หนึ่งสำหรับไฟล์ทำงาน:

mkdir workingfiles
mkdir barerepo.git

เริ่มต้น repo คอมไพล์เปลือย:

cd barerepo.git
git --bare init 

จากนั้นสร้างเบ็ด post-receive:

touch hooks/post-receive
chmod ug+x hooks/post-receive

แก้ไขโพสต์ - รับในการแก้ไขที่คุณชื่นชอบ:

GIT_WORK_TREE=/path/to/workingfiles git checkout -f
# optional stuff:
cd down/to/some/directory
[do some stuff]

เพิ่มเป็นรีโมต:

git remote add myserver ssh://user@host:/path/to/barerepo.git

/workingfiles/ตอนนี้เวลาที่คุณผลักดันที่จะซื้อคืนเปลือยนี้ทุกมันจะเช็คเอาต้นไม้ที่ทำงานเพื่อ แต่/workingfiles/ตัวมันเองไม่ได้อยู่ภายใต้การควบคุมเวอร์ชัน ทำงานgit statusในจะให้ข้อผิดพลาด/workingfiles/ fatal: Not a git repository (or any parent up to mount point /data)มันเป็นแค่ไฟล์ธรรมดา

rm -r .gitไม่จำเป็นต้องใช้คำสั่งแก้ไขปัญหาอื่น ๆดังนั้นหาก/workingfiles/เป็น repo git อื่น ๆ คุณไม่ต้องกังวลกับคำสั่งที่ใช้ลบไฟล์ git ของ repo อื่น


1
ตกลง มีตะขอเกี่ยวกับการโพสต์บน repo เปล่าที่นี่ +1
VonC

ทำงานมากถ้าคุณเพียงแค่พยายามที่จะรับไฟล์
Rainb

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