วิธีดึงไดเรกทอรีเฉพาะด้วย git


193

ฉันมีโครงการที่มีคอมไพล์และฉันต้องการโคลนหรือดึงไดเรกทอรีเฉพาะเช่น myproject / javascript เช่นเดียวกับการโค่นล้ม
ทำการเปลี่ยนแปลงกระทำและผลักดันอีกครั้ง
มันเป็นไปได้?


3
การชำระเงินแบบกระจัดกระจายอาจทำให้คุณสนใจ (แม้ว่าคุณยังคงต้องดึงข้อมูลทุกอย่าง): ดูstackoverflow.com/questions/2416815/…
VonC

คำตอบ:


205
  1. cd ไปที่ด้านบนสุดของสำเนา repo ของคุณ
  2. git fetch
  3. git checkout HEAD path/to/your/dir/or/file

    • อยู่ที่ไหน " path/..." ใน (3) เริ่มต้นที่ไดเรกทอรีเพียงด้านล่างราก repo ที่มีของคุณ " .../file"

    • โปรดทราบว่าแทนที่จะใช้ "HEAD" อาจใช้รหัสแฮชของการคอมมิทเฉพาะและจากนั้นคุณจะได้รับการแก้ไข (ไฟล์) หรือการแก้ไข (dir) เฉพาะสำหรับคอมมิทนั้น


1
เพิ่งรู้ว่าฉันเข้าใจผิดคำถาม คำตอบของฉันจะระบุวิธีการชำระเงินไฟล์เดียวซึ่งสามารถแก้ไขและยืนยันได้
vergueishon

คุณพูดถึงชื่อของคำถามซึ่งดีพอ นี่เป็นเพียงการช่วยฉันเท่าที่ฉันกังวลนี่เป็นคำตอบที่ถูกต้อง - โดยเฉพาะอย่างยิ่งเนื่องจากเป็นที่นิยมที่สุดใน Google สำหรับปัญหานี้
Morgon

21
สิ่งนี้ยังคงได้รับการซื้อคืนทั้งหมด สำหรับโครงการ 2GB ในขนาดนี้ไม่ได้ประหยัดเวลามาก ..
Pithikos

5
สำหรับผู้ที่อ่านความคิดเห็นเหล่านี้และไม่ทราบว่าวิธีนี้ไม่ตอบคำถามสิ่งที่โซลูชันนี้ให้คุณคัดลอกเพียงหนึ่งโฟลเดอร์นั้น แต่ไม่ใช่สำเนาที่ใช้งานได้ซึ่งหมายความว่าคุณไม่สามารถแก้ไขได้อีก -commit ดังนั้นตามที่ @Morgon กล่าวว่ามันอยู่ที่ชื่อของคำถาม (คุณสามารถดึงเพียงหนึ่ง dir) แต่ไม่ตอบคำถามของคำถาม ("ทำการเปลี่ยนแปลงบางอย่างกระทำและผลักกลับอีกครั้ง")
msb

@StanHolodnak --ไม่จำเป็นว่า มันบังคับให้บิตหลังจากที่มันถูกตีความว่าเป็นเส้นทาง ดังนั้นใช่ถ้าคุณมีไฟล์ที่มีชื่อ--helpที่คุณต้องการเช็คเอาต์จะต้องนำหน้าด้วยเครื่องหมายขีดคั่นเหล่านี้:git checkout HEAD -- --help
Tim Visée

105

ในไดเรกทอรีว่าง:

git init
git remote add [REMOTE_NAME] [GIT_URL]
git fetch REMOTE_NAME
git checkout REMOTE_NAME/BRANCH -- path/to/directory

งานนี้ถ้าคุณต้องการที่จะใช้รุ่นจากระยะไกลของไฟล์ที่จะแทนที่แฟ้มท้องถิ่นผมคิดว่า
จอห์น

วิธีนี้จะดึงโฟลเดอร์ด้วยวิธีการไม่โหลดโฟลเดอร์ แต่มีเพียงสิ่งภายในโฟลเดอร์เท่านั้น
Al Kasih

ไม่จำเป็นต้องมีfetchหรือcheckoutคำสั่งใด ๆเราสามารถทำการร้องขอการดึงหลังจากremote addคำสั่งเพื่อรับสาขาหลักทั้งหมด
Iqra

2
เนื่องจาก Pithkos ชี้ให้เห็นในคำตอบที่ยอมรับคำตอบนี้จะดาวน์โหลดที่เก็บระยะไกล WHOLE ไปยังเครื่องท้องถิ่นของคุณ คำตอบของ shingara นั้นชัดเจนที่สุด - ไม่มีวิธีดึงส่วนหนึ่งของ repo จากระยะไกล อย่างไรก็ตามสำหรับผู้ที่ไม่สนใจแบนด์วิดท์ของการดึงข้อมูลทั้งหมดและมีความสนใจในการทำสำเนาการทำงานของแคชท้องถิ่นบางส่วนคำตอบที่ยอมรับจะแสดงให้คุณเห็นว่าอย่างไร แต่ฉันแค่ต้องการทำให้ชัดเจนประวัติทั้งหมดของ repo (ในรูปแบบที่บีบอัด) ต้องถูกดาวน์โหลดลงในเครื่องของคุณ
Gabe Halsmer

39

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

วิธีการ git-pull ทั้งหมดยกเว้นโฟลเดอร์เดียว

หากต้องการคัดลอกวางมีอะไร:

git init
git remote add -f origin <url>
git config core.sparsecheckout true
echo <dir1>/ >> .git/info/sparse-checkout
echo <dir2>/ >> .git/info/sparse-checkout
echo <dir3>/ >> .git/info/sparse-checkout
git pull origin master

ในการทำสิ่งที่ OP ต้องการ (ทำงานเพียงหนึ่ง dir เท่านั้น) เพียงเพิ่ม dir .git/info/sparse-checkoutนั้นเมื่อทำตามขั้นตอนข้างต้น

ขอบคุณมาก @cforbish!


2
ฉันโพสต์ที่นี่เป็นส่วนใหญ่เพราะเมื่อใดก็ตามที่ฉันพยายาม google วิธีการทำนี่คือผลสูงสุดและด้ายที่ไม่ได้ใกล้เคียงกับการแสดง :( ฉันรู้สึกว่าการคัดลอกไม่ดี แต่ฉันคิดว่ามันเป็นแนวทางปฏิบัติที่ดีที่สุดเหรอ
msb

1
นี่เป็นทางเลือกเดียวที่สะอาด ลองคำตอบข้างต้น หลังจากที่ฉันตรวจสอบสาขาของฉันด้วยคำตอบอื่น ๆ ฉันไม่สามารถดึงและมีไฟล์ใหม่หลายไฟล์ที่ต้องการยืนยัน ด้วยโซลูชันนี้ทุกอย่างดูถูกต้อง แต่หมายเหตุ: masterโดยไม่คำนึงถึงสาขาที่ได้รับการตรวจสอบออกคอมไพล์จะคิดว่าคุณจะอยู่ใน เพียงให้แน่ใจว่าคุณทำgit branch --set-upstream-to=origin/<branch>เพื่อดึงอย่างถูกต้อง
seebiscuit

12

มันเป็นไปไม่ได้. คุณต้องดึงที่เก็บทั้งหมดหรือไม่ทำอะไรเลย


1
แม้ว่าคุณจะต้องดึงข้อมูลทุกอย่าง แต่การดึงต้นไม้ที่ทำงานเช็คเอาต์แบบกระจัดกระจายจะเป็นที่สนใจในกรณีนี้หรือไม่ ดูstackoverflow.com/questions/2416815/…
VonC

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

12
@OmnipotentEntity ขออภัย IMHO มันไม่เข้าท่า การใช้งานไม่ควร จำกัด การใช้งาน Git รู้ว่าไดเร็กตอรี่คืออะไร (อย่างน้อยเมื่อสร้างสำเนาการทำงานแบบโลคอล) ดังนั้นจึงไม่มีเหตุผลที่มันไม่สามารถทำการดำเนินการที่คล้ายกันบางอย่างบนเซิร์ฟเวอร์และเพียงแค่ส่งเอาต์พุตที่เกี่ยวข้อง จริงอยู่ที่ตอนนี้ยังไม่ได้ใช้งาน แต่เป็นเพราะขาดคุณสมบัติไม่ใช่ความเป็นไปไม่ได้พื้นฐาน โดยส่วนตัวฉันคิดว่ามันเป็นคุณสมบัติที่สำคัญทีเดียว แต่เดี๋ยวก่อนนั่นคือเหตุผลหนึ่งที่ฉันหลีกเลี่ยงการใช้คอมไพล์เมื่อทำได้
พื้นฐาน

10

บางทีคำสั่งนี้อาจมีประโยชน์:

git archive --remote=MyRemoteGitRepo --format=tar BranchName_or_commit  path/to/your/dir/or/file > files.tar

"Et voilà"


2
นี่เป็นการดาวน์โหลดไดเรกทอรีเฉพาะของไฟล์เพื่อการเก็บถาวรซึ่งจะไม่ดึงสำเนาที่คุณสามารถแก้ไขและดันกลับได้
leetNightshade

เด็ดมาก อาจไม่เป็นที่ยอมรับในฐานะวิธีแก้ปัญหาของ OP แต่จริงๆแล้วสิ่งที่ฉันเป็นหลังจากนั้นคือฉันต้องค้นหาเนื้อหาของโฟลเดอร์ขนาดใหญ่ใน repo ที่ยิ่งใหญ่กว่าฉันไม่ต้องการเรียกและฉันไม่จำเป็นต้องแก้ไข / ดัน
โอลิเวอร์

7

หากคุณต้องการรับการเปลี่ยนแปลงล่าสุดในไดเรกทอรีโดยไม่ต้องป้อนคุณสามารถทำได้:

$ git -C <Path to directory> pull

4

git clone --filter จาก Git 2.19

ตัวเลือกนี้จะข้ามการดึงข้อมูลวัตถุที่ไม่จำเป็นออกจากเซิร์ฟเวอร์

ฉันเขียนคำตอบโดยละเอียดเพื่ออธิบายสถานะการสนับสนุนปัจจุบันที่: ฉันจะโคลนไดเรกทอรีย่อยของที่เก็บ Git ได้อย่างไร

มีความเป็นไปได้สูงที่สิ่งใดก็ตามที่ถูกนำไปใช้git cloneในพื้นที่นั้นจะมีgit pullแอนะล็อก


1

พยายามและทดสอบงานนี้!

mkdir <directory name> ;  //Same directory name as the one you want to pull
cd <directory name>;
git remote add origin <GIT_URL>;
git checkout -b '<branch name>';
git config core.sparsecheckout true;
echo <directory name>/ >> .git/info/sparse-checkout;
git pull origin <pull branch name>

หวังว่านี่จะเป็นประโยชน์!


0

บางครั้งคุณเพียงแค่ต้องการดูสำเนาของไฟล์ก่อนหน้านี้โดยไม่ต้องมีอุปสรรคในการผ่านส่วนต่าง

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


-1

สำหรับทุกสิ่งที่ต่อสู้กับเส้นทางไฟล์เชิงทฤษฎีและตัวอย่างเช่นฉันนี่เป็นตัวอย่างโลกแห่งความจริง: Microsoft เสนอเอกสารและตัวอย่างของพวกเขาในฮับ git โชคไม่ดีที่พวกเขารวบรวมไฟล์ตัวอย่างทั้งหมดสำหรับหัวข้อจำนวนมากในที่เก็บนี้:

https://github.com/microsoftarchive/msdn-code-gallery-community-s-z

ฉันสนใจไฟล์ js Microsoft Dynamics ในพา ธ เท่านั้น

msdn-code-gallery-community-s-z/Sdk.Soap.js/

ดังนั้นฉันทำต่อไปนี้

สร้าง

msdn-code-gallery-community-s-zSdkSoapjs\.git\info\sparse-checkout

ไฟล์ในโฟลเดอร์ที่เก็บของฉันบนดิสก์

git sparse-checkout init

ในไดเรกทอรีนั้นโดยใช้ cmd บน windows

เนื้อหาไฟล์ของ

msdn-code-gallery-community-s-zSdkSoapjs\.git\info\sparse-checkout

คือ

Sdk.Soap.js/*

ในที่สุดก็ทำ

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