วิธีรับ Git เพื่อโคลนลงในไดเรกทอรีปัจจุบัน


499

ฉันกำลังทำ:

git clone ssh://user@host.com/home/user/private/repos/project_hub.git ./

ฉันได้รับ:

ร้ายแรง: เส้นทางปลายทาง '.' มีอยู่แล้วและไม่ใช่ไดเรกทอรีว่าง

ฉันรู้เส้นทาง มีอยู่แล้ว. และฉันสามารถมั่นใจได้ว่าไดเรกทอรีว่างเปล่า (ฉันทำข้างในและไม่เห็นอะไรเลย!)

ฉันทำอะไรที่นี่เพื่อโคลนโปรเจ็กต์นั้นลงในไดเรกทอรีปัจจุบัน


16
ถ้าคุณทำls -aคุณเห็น.gitไดเรกทอรีหรือไม่?
Davin Tryon

2
@dtryon - ไม่ แต่ฉันเห็น DS_Store ไม่ว่ามันจะเป็นอะไรก็ตาม บางทีฉันควรกำจัดมัน ขอบคุณสำหรับ -a: s
MEM

@ ขอบคุณสี่คำตอบอย่างรวดเร็วของคุณ James Maclaughlin ที่ดูเหมือนคำสั่งที่สวยงามเพื่อให้แน่ใจว่าเราโคลนไปยังไดเรกทอรีที่ว่างเปล่า :)
MEM

1
ฉันสมมติว่าแล้วคุณจะอยู่บน Mac สิ่งนี้ช่วยได้บ้าง: stackoverflow.com/questions/107701/…
Davin Tryon

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

คำตอบ:


509

เพียงแค่ใส่จุดถัดจากมัน

git clone git@github.com:user/my-project.git .

จากgit help clone:

การโคลนลงในไดเรกทอรีที่มีอยู่จะได้รับอนุญาตเฉพาะเมื่อไดเรกทอรีว่างเปล่า

ดังนั้นตรวจสอบให้แน่ใจว่าไดเรกทอรีว่างเปล่า (ตรวจสอบด้วยls -a) มิฉะนั้นคำสั่งจะล้มเหลว


18
ตกลงโปรดทราบว่าสำหรับ mac ไฟล์อัตโนมัติ. DS_Store ที่สร้างโดยโปรแกรมค้นหาจะบล็อกการโคลน ตรวจสอบกับls -la
ptim

281
Nope นี่ไม่ใช่คำตอบที่ถูก สิ่งนี้จะยังคงกลับมา "ร้ายแรง: เส้นทางปลายทาง". ' มีอยู่แล้วและไม่ใช่ไดเรกทอรีว่าง "
Sid Sarasvati

16
ใช้งานได้สำหรับฉันโดยใช้ git v1.8.3.2 @SidSarasvati คุณแน่ใจไดเรกทอรีปัจจุบันเป็นที่ว่างเปล่า ?
Wesley Baugh

3
@SidSarasvati ดีสำหรับฉัน directoy ไม่ได้ว่างเปล่า แต่ฉันไม่สนใจเลยดังนั้นฉันไม่แน่ใจว่าทำไม Git ถึงต้องการ เหตุใดจึงไม่สามารถคอมไพล์โคลนไปยังไดเรกทอรีที่ไม่ว่างได้ functionaly แน่นอนมันเป็นเพียงการดาวน์โหลดพื้นฐาน
นาธานฮอร์นบี้

3
mkdirสร้างการเชื่อมโยงไปยัง.และ..โดยค่าเริ่มต้นดังนั้นไดเรกทอรีใหม่ในทางเทคนิค "ว่างเปล่า" ในระบบที่ใช้ Unix เลย? ฉันหมายถึงฉันเดาว่าคุณทำได้unlink .และunlink ..นั่นอาจทำให้คุณเกิดปัญหาใหญ่ในภายหลังถ้าคุณลืมที่จะเชื่อมโยงอีกครั้งหลังจากการโคลนนิ่ง ....
SeldomNeedy

351

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

git init .
git remote add -t \* -f origin <repository-url>
git checkout master

ในกรณีของฉันนี้จะสร้าง.git/configไฟล์ซึ่งเทียบเท่ากับไฟล์ที่ฉันได้รับเมื่อทำการโคลน


40
นอกจากนี้นี่คือคาถาที่ช่วยให้เนื้อหาปัจจุบันยังคงอยู่ - พูดว่าถ้าคุณโคลน dotfiles ของคุณในไดเรกทอรีบ้านของคุณ
rbellamy

7
ด้วยวิธีนี้ในที่สุดฉันก็ได้รับอนุญาตให้ลอกแบบไปยังโฟลเดอร์ใดก็ได้ที่ฉันชอบโดยไม่ต้อง Git ปฏิบัติต่อฉันเหมือนเด็ก เมื่อฉันยังเพิ่ม. gitignore ชั่วคราวที่มี*(ละเว้นทุกสิ่ง) ฉันสามารถดำเนินการgit checkout masterได้แม้ว่าจะมีไฟล์อื่น ๆ อยู่ในโฟลเดอร์แล้ว จากนั้นไฟล์ที่คอมมิตทั้งหมดจากที่เก็บถูกโคลน (และ. gitignore ชั่วคราวถูกเขียนทับโดย. gitignore ที่เหมาะสมจาก repo) มันทำงานได้อย่างมหัศจรรย์ มันควรจะเกิดขึ้นด้วยตัวเองโดยใช้git clone -fหรืออะไร
PaulMag

1
หากคุณมีไฟล์ที่แตกต่าง / ใหม่ / เปลี่ยนแปลงที่จะเขียนทับ (... ไฟล์จะถูกเขียนทับโดยเช็คเอาท์ ... ยกเลิกการใช้): git checkout master -f
visualex

3
-t \*ไม่จำเป็นขณะที่มันเป็นค่าเริ่มต้น
Palec

1
git remote set-head origin -aอาจจะมีประโยชน์ มันตั้งค่าสาขาเริ่มต้นของต้นกำเนิด ( refs/remotes/origin/HEAD) ตามที่ตั้งไว้ในที่เก็บระยะไกล โดยอัตโนมัตินี้ไม่แตกต่างจากgit clone git remote add -f
Palec

212

@Andrew ได้ตอบอย่างชัดเจนที่นี่ แต่ง่ายอย่างนี้ยังใช้งานได้แม้ว่าไดเรกทอรีจะไม่ว่างเปล่า:

git init .
git remote add origin <repository-url>
git pull origin master

ฉันมีความสุขที่จะยืนยัน<repository-url>สามารถเป็น repo ในพื้นที่ได้เช่นกันgit remote add origin /path/to/existing/repo
krubo

60

เพื่อให้แน่ใจว่าคุณสามารถคัดลอก repo ไปที่ไดเรกทอรีชั่วคราวและโคลนโครงการที่นั่น:

git clone ssh://user@host.com/home/user/private/repos/project_hub.git

สิ่งนี้จะโคลนข้อมูลของคุณลงในproject_hubไดเรกทอรี

เมื่อการโคลนเสร็จสิ้นคุณสามารถย้ายไดเรกทอรีนี้ได้ทุกที่ที่คุณต้องการ:

mv project_hub /path/to/new/location

สิ่งนี้ปลอดภัยและไม่ต้องการสิ่งมหัศจรรย์ใด ๆ


9
สิ่งนี้จะสร้างไดเรกทอรีย่อยในไดเรกทอรีที่มีอยู่แล้ว/path/to/new/locationซึ่งไม่ใช่จุดของคำถามอย่างแน่นอน
Pavel Šimerda

จากนั้นคุณจะต้องย้ายไฟล์ที่ซ่อนอยู่ด้วยตนเองหรือใช้คำสั่งที่ซับซ้อน ... และจะไม่ตอบคำถาม
Black



15

อืม ... ระบุเส้นทางที่แน่นอนในปัจจุบันโดยใช้$(pwd)งานได้สำหรับฉัน

git clone https://github.com/me/myproject.git $(pwd)

รุ่น git: 2.21.0


13

หากไดเรกทอรีปัจจุบันว่างเปล่าสิ่งนี้จะทำงาน:

git clone <repository> foo; mv foo/* foo/.git* .; rmdir foo

1
ในกรณีของฉันมันใช้งานได้แม้จะมีไฟล์บางไฟล์ใน '.' ไดเรกทอรี
OSdave

2
โปรดทราบว่า dotfiles ใด ๆ ในไดเรกทอรีภายใต้ foo เช่น foo / bar / .foobar จะไม่ถูกย้ายด้วยคำสั่งนี้ ดูคำตอบจาก @phatblat
lea

10

นอกจากคำตอบของ @ StephaneDelcroix ก่อนใช้:

git clone git@github.com.user/my-project.git .

ตรวจสอบให้แน่ใจว่า dir ปัจจุบันของคุณว่างเปล่าโดยใช้

ls -a

ต้องเผชิญกับปัญหานี้ในวันนี้ ปรากฏว่าฉันซ่อนโฟลเดอร์. git และ. gitignore ในไดเรกทอรีที่ฉันพยายามโคลนที่เก็บ เมื่อฉันลบโฟลเดอร์เหล่านี้ทุกอย่างก็โอเค
Tamara

สิ่งที่จะสั่งให้ว่างเปล่า dir ปัจจุบัน? ผมคิดว่าจะเป็นประโยชน์มากกว่าเพียงแค่การตรวจสอบ :)
pie6k

9

การแก้ไข: ในกรณีนี้การแก้ปัญหาคือการใช้dotดังนั้น:rm -rf .* && git clone ssh://user@host.com/home/user/private/repos/project_hub.git .

rm -rf .* && อาจถูกละเว้นหากเราแน่ใจอย่างยิ่งว่าไดเรกทอรีนั้นว่างเปล่า

เครดิตไปที่: @James McLaughlin จากความคิดเห็นด้านล่าง


10
สิ่งนี้ดูชั่วร้ายเนื่องจาก. * รวมไดเรกทอรีหลัก! ฉัน: ~ / tmp / tmp / tmp $ ls -d .* . .. ฉัน: ~ / tmp / tmp / tmp $
stackunderflow

สิ่งนี้ไม่ได้ช่วยเพราะฉันมีการอ้างอิงในไดเรกทอรีที่ฉันต้องชำระเงิน
b01

18
ฉันไม่แน่ใจว่าควรเขียน rm -rf (ในรูปแบบใด ๆ ) ลงในคำตอบ SO โดยไม่มีสัญญาณเตือน SCARY ที่น่ากลัวจริงๆ ผู้ใช้ที่ไม่มีประสบการณ์บางคนอาจมาที่นี่เพื่อค้นหา "เครื่องหมายถูกสีเขียว" (โดยปกติจะเป็นคำตอบที่ดีที่สุด) จากนั้นคัดลอก - วางคำสั่งนี้และคนโง่ ... เขาทำงานหนักในไดเรกทอรีปัจจุบัน BTW: rm -rf ./.*คือ "ปลอดภัยกว่า" ถ้าคุณเพิ่งลบไฟล์และไดเรกทอรี (จุด) ที่ซ่อนอยู่ภายใต้ dir ปัจจุบัน (เช่นเดียวกับ @stackunderflow ที่ระบุไว้ก่อนหน้าฉัน) แต่rm -rfเป็นคำสั่งที่อันตรายสำหรับผู้ใช้ที่ไม่มีประสบการณ์ดังนั้นจงระวังด้วย! แค่ 2 เซ็นต์ของฉัน
แอนดรู

ทำงานบน 1.7.1 โฟลเดอร์เดียวข้างในคือ.gitหลังจากgit init(ฉันรู้)
vladkras

คุณไม่จำเป็นต้อง-rfลบไฟล์ปกติ โปรดลองลบคำตอบนี้หรือยอมรับคำตอบอื่นอย่างน้อยที่สุด
Navin

6

การปรับปรุงคำตอบของ @ GoZoner:

git clone <repository> foo; shopt -s dotglob nullglob; mv foo/* .; rmdir foo

คำสั่ง shopt นั้นนำมาจากคำตอบ SO นี้และเปลี่ยนพฤติกรรมของคำสั่ง 'mv' ใน Bash เพื่อรวม dotfiles ซึ่งคุณจะต้องรวมไดเรกทอรี. git และไฟล์ที่ซ่อนอื่น ๆ

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


6

ฉันมีความต้องการแบบเดียวกันนี้ ในกรณีของฉันฉันมีเว็บโฟลเดอร์มาตรฐานซึ่งสร้างโดยการติดตั้งเว็บเซิร์ฟเวอร์ สำหรับวัตถุประสงค์ของภาพประกอบนี้สมมติว่านี่คือ

/server/webroot

และ webroot มีไฟล์และโฟลเดอร์มาตรฐานอื่น ๆ repo ของฉันเพิ่งมีไฟล์เฉพาะไซต์ (html, javascript, CFML และอื่น ๆ )

สิ่งที่ฉันต้องทำคือ:

cd /server/webroot

git init

git pull [url to my repo.git]

คุณต้องระมัดระวังในการทำ git init ในโฟลเดอร์เป้าหมายเพราะหากคุณไม่ทำสองสิ่งต่อไปนี้:

  1. การดึง git นั้นจะล้มเหลวโดยมีข้อความเกี่ยวกับไม่มีไฟล์ git ในกรณีของฉัน:

ร้ายแรง: ไม่ใช่ที่เก็บ git (หรือไดเรกทอรีหลัก): .git

  1. หากมีคือบางไฟล์ .git ในเส้นทางของผู้ปกครองไปยังโฟลเดอร์ของคุณ repo ดึงของคุณจะถูกสร้างขึ้นในผู้ปกครองที่ประกอบด้วยแฟ้ม .git เรื่องนี้เกิดขึ้นกับฉันและฉันรู้สึกประหลาดใจกับมัน ;-)

สิ่งนี้ไม่รบกวนไฟล์ "มาตรฐาน" ใด ๆ ที่ฉันมีในโฟลเดอร์ webroot ของฉัน แต่ฉันต้องการเพิ่มลงในไฟล์. gitignore เพื่อป้องกันการเพิ่มโดยไม่ตั้งใจไปยังการกระทำที่ตามมา

ดูเหมือนว่าวิธี "โคลน" ง่ายๆในไดเรกทอรีที่ไม่ว่างเปล่า หากคุณไม่ต้องการไฟล์. git และ. gitignore ที่สร้างโดย pull เพียงแค่ลบมันหลังจาก pull


5

ปรับปรุงเพิ่มเติมตามคำตอบของ @ phatblat :

git clone --no-checkout <repository> tmp \
  && mv tmp/.git . \
  && rmdir tmp \
  && git checkout master

เป็นหนึ่งซับ:

git clone --no-checkout <repository> tmp && mv tmp/.git . && rmdir tmp && git checkout master


2
shopt -s dotglob
git clone ssh://user@host.com/home/user/private/repos/project_hub.git tmp && mv tmp/* . && rm -rf tmp

3
ให้ข้อมูลเพิ่มเติมเพื่ออธิบายสาเหตุที่รหัสของคุณแก้ไขปัญหาและทำอะไรได้บ้าง
Martin

"git clone ... tmp" - สร้างโฟลเดอร์ / tmp ในไดเร็กทอรีที่คำสั่งถูกเรียกใช้งานและโคลนที่เก็บ Git จากนั้น "mv tmp / *." - ย้ายไฟล์ทั้งหมดจากโฟลเดอร์ / tmp ในโฟลเดอร์พาเรนต์ (ซึ่งคำสั่งก่อนหน้านี้ถูกเรียกใช้งาน) และในที่สุด "rm -rf tmp" - ลบโฟลเดอร์ / tmp
Marinski

1

ใช้. (จุด) ท้ายคำสั่งของคุณเช่นด้านล่าง

โคลนคอมไพล์URL


นี้ไม่ได้ทำงานบน Mac จะทำให้เกิดข้อผิดพลาด: fatal: destination path '.' already exists and is not an empty directory.
เปโดร Luz

สำหรับ mac :: คุณควรอยู่ภายใต้ไดเรกทอรีหลักแล้วใช้ชื่อโฟลเดอร์แทน. (จุด) เช่นด้านล่าง git clone flodername URL ตรวจสอบให้แน่ใจว่าโฟลเดอร์ของคุณว่างเปล่า
Upendra

0

นี่คือสิ่งที่ฉันพบ:

ฉันเห็นสิ่งนี้:

fatal: destination path 'CouchPotatoServer' already exists and is not an empty directory.

ในการค้นหาของฉันฉันพบกับ:

https://couchpota.to/forum/viewtopic.php?t=3943

ค้นหารายการโดย Clinton.Hall ... ถ้าคุณลอง (เหมือนที่ฉันทำ) คุณอาจจะได้รับการaccess deniedตอบกลับมีเบาะแสแรกของฉันดังนั้นข้อผิดพลาดเริ่มต้น (สำหรับฉัน) เป็นจริงที่จะกำจัดรากผิด ปัญหา.

โซลูชันสำหรับสิ่งนี้ใน windows: ตรวจสอบให้แน่ใจว่าคุณเรียกใช้cmdหรือgit elevatedจากนั้นเรียกใช้:

git clone https://github.com/RuudBurger/CouchPotatoServer.git

ข้างต้นเป็นปัญหาของฉันและเพียงยกระดับการทำงานให้ฉัน


0

ทางออกสำหรับWindowsคือการโคลนที่เก็บไปยังโฟลเดอร์อื่นแล้วคัดลอกและวางไปยังตำแหน่งเดิมหรือเพียงแค่คัดลอก.gitโฟลเดอร์ที่มองไม่เห็น


-1

ลบด้วย

rm -rf. *

อาจทำให้คุณมีปัญหาหรือมีข้อผิดพลาดเพิ่มเติม

หากคุณมี / path / to / folder และต้องการลบทุกอย่างภายใน แต่ไม่ใช่โฟลเดอร์นั้นเพียงแค่เรียกใช้:

rm -rf / path / to / folder / *


-1

ดังนั้นฉันจึงแก้ไขข้อผิดพลาดเดียวกันนี้ได้โดยการลบโฟลเดอร์. git ที่ซ่อนอยู่ในไดเรกทอรีรากของฉันแล้วเพิ่มจุดใน 'git clone repo' ในโฟลเดอร์ root / dist ของฉัน นี่คือบริบทของโครงการ vue-cli webpack ดังนั้นสิ่งที่คนอื่นพูดถูกต้องโดยปกติแล้วหมายความว่าคุณมีการติดตามคอมไพล์ในโฟลเดอร์ที่คุณพยายามโคลนหรือในโฟลเดอร์หลักหรือรูทของโฟลเดอร์ที่สงสัย!


-1
git clone ssh://user@host.com/home/user/private/repos/project_hub.git $(pwd)

โปรดทราบว่าสิ่งนี้จะยังคงส่งผลให้เกิดข้อผิดพลาดเดียวกันที่โพสต์ในคำถาม (" ร้ายแรง: เส้นทางปลายทาง 'แก้ไข / เส้นทาง / ของ / pwd' มีอยู่แล้วและไม่ได้เป็นไดเรกทอรีว่าง ") ถ้าคุณทำเช่นนี้ในที่ไม่ว่างเปล่า ไดเรกทอรี
Gino Mempin


-2

มีประโยชน์ในการสร้างไฟล์ใหม่ด้วยmkdir filenameจากนั้นเรียกใช้คำสั่งของgit clone xxxxxมันจะทำงานในคอมพิวเตอร์ของฉัน


-3

ฉันได้เห็นคำถามนี้หลายครั้ง - และฉันต้องการชี้ให้เห็นว่าgit pullจากในไดเรกทอรีของคุณจะทำเคล็ดลับ

นอกจากว่าฉันขาดอะไรบางอย่างที่นี่ - ที่ทำงานสำหรับฉัน


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