ฉันจะโคลนไปยังไดเรกทอรีที่ไม่ว่างได้อย่างไร


572

ฉันมีไดเรกทอรี A พร้อมแฟ้มที่ตรงกับไดเรกทอรี B. ไดเรกทอรี A อาจมีไฟล์อื่น ๆ ที่จำเป็น Directory B เป็น repo คอมไพล์

ฉันต้องการโคลนไดเรกทอรี B ไปยังไดเรกทอรี A แต่ git-clone ไม่อนุญาตให้ฉันเนื่องจากไดเรกทอรีไม่ว่างเปล่า

ฉันหวังว่ามันจะโคลน. git และเนื่องจากไฟล์ทั้งหมดตรงกับที่ฉันสามารถไปจากที่นั่นได้หรือไม่

ฉันไม่สามารถโคลนไปยังไดเรกทอรีว่างได้เพราะฉันมีไฟล์ในไดเรกทอรี A ซึ่งไม่ได้อยู่ในไดเรกทอรี B และฉันต้องการเก็บไว้

การคัดลอก. git ไม่ใช่ตัวเลือกเนื่องจากฉันต้องการให้ผู้ใช้กด / ดึงและฉันไม่ต้องการตั้งค่าด้วยตนเอง

มีวิธีการทำเช่นนี้?

อัปเดต: ฉันคิดว่าใช้งานได้ทุกคนสามารถเห็นปัญหาใด ๆ ได้บ้าง ->

cd a
git clone --no-hardlinks --no-checkout ../b a.tmp 
mv a.tmp/.git .
rm -rf a.tmp
git unstage # apparently git thinks all the files are deleted if you don't do this

5
บางทีคุณสามารถเปลี่ยนคำตอบที่ยอมรับได้?
Bastiaan Quast

คำตอบ:


724

สิ่งนี้ใช้ได้กับฉัน:

git init
git remote add origin PATH/TO/REPO
git fetch
git reset origin/master  # Required when the versioned files existed in path before "git init" of this repo.
git checkout -t origin/master

หมายเหตุ: -tจะตั้งค่าสาขาต้นน้ำสำหรับคุณหากนั่นคือสิ่งที่คุณต้องการและโดยปกติจะเป็น


70
สิ่งนี้ไม่ทำงานในไดเรกทอรีที่ไม่ว่างเปล่าเมื่อไฟล์ขาเข้ามีอยู่แล้ว (ตามคำถามเดิมอธิบาย) แต่ถ้าคุณgit reset origin/masterหลังจากgit fetchนั้นมันจะทำงาน (เช่นการรักษาการเปลี่ยนแปลงในท้องถิ่นใด ๆ )
Araxia

8
ร้ายแรง: ไม่สามารถอัปเดตพา ธ และเปลี่ยนเป็น 'ต้นแบบ' ของสาขาในเวลาเดียวกัน
Arnold Roa

7
คำตอบนี้ไม่ได้ผลสำหรับฉัน เมื่อฉันgit checkout ...คอมไพล์บ่นว่าไฟล์ทั้งหมดของฉันจะถูกเขียนทับและฉันควรย้ายพวกเขาก่อน เมื่อฉันทำ `git reset Origin / master /` ก่อนอื่นคำสั่ง checkout จะบ่นว่ามีสาขาชื่อ master อยู่แล้ว
Saskia

4
git checkout masterเป็นขั้นตอนสุดท้ายที่เพียงพอสำหรับฉัน
yoyo

16
ทุกขั้นตอนทำงานอย่างสมบูรณ์ fatal: A branch named 'master' already existsแต่สุดท้ายผม: ฉันคิดว่าฉันไม่ต้องการมันจริงๆ
Shadi

164

ในคำสั่งเชลล์ต่อไปนี้existing-dirเป็นไดเรกทอรีที่มีเนื้อหาตรงกับไฟล์ที่ถูกติดตามในที่repo-to-cloneเก็บ git

# Clone just the repository's .git folder (excluding files as they are already in
# `existing-dir`) into an empty temporary directory
git clone --no-checkout repo-to-clone existing-dir/existing-dir.tmp # might want --no-hardlinks for cloning local repo

# Move the .git folder to the directory with the files.
# This makes `existing-dir` a git repo.
mv existing-dir/existing-dir.tmp/.git existing-dir/

# Delete the temporary directory
rmdir existing-dir/existing-dir.tmp
cd existing-dir

# git thinks all files are deleted, this reverts the state of the repo to HEAD.
# WARNING: any local changes to the files will be lost.
git reset --hard HEAD

5
ฉันต้องทำมิgit reset --hard HEADฉะนั้นจะไม่ยอมแพ้กับไฟล์ "ลบ"
Dimitar

18
git reset HEADทำงานได้ดีสำหรับฉัน git reset --hard HEADทำลายการเปลี่ยนแปลงใด ๆ ในไฟล์ของคุณดังนั้นหากการเปลี่ยนแปลงนั้นไม่เหมือนกับไฟล์ในที่เก็บคุณไม่ควรทำเช่นนั้น
Tgr

1
git reset HEADดูเหมือนจะไม่ส่งผลกระทบใด ๆ กับฉัน git reset --hard HEADทำ - แต่นั่นทำให้สูญเสียการเปลี่ยนแปลงใด ๆ ที่คุณทำกับไฟล์ มีวิธีแก้ปัญหาที่ดีกว่านี้ไหม?
Jacob Dorman

1
@ คำตอบของ Casey - git init / remote เพิ่ม / fetch / checkout - สะอาดและเรียบง่ายขึ้นและไม่ต้องใช้โฟลเดอร์ชั่วคราวใด ๆ
yoyo

1
@ คำตอบของ Casey ไม่ได้ผลสำหรับฉันเมื่อมีไฟล์ในโฟลเดอร์ที่ต้องการอยู่ แต่ไม่ได้อยู่ใน git repo สิ่งนี้มีประโยชน์สำหรับการอัพเดต config หลังจากรันสคริปต์การติดตั้งที่สร้างไฟล์และไดเรกทอรี แต่คุณต้องอัปเดต / เพิ่มไฟล์ที่ด้านบนของรายการที่ติดตั้ง
soulston

104

การปรับเปลี่ยนเล็กน้อยในหนึ่งในคำตอบที่เหมาะกับฉัน:

git init
git remote add origin PATH/TO/REPO
git pull origin master

เพื่อเริ่มทำงานในสาขาหลักทันที


1
ต้องทำการรีเซ็ต HEAD - ฮาร์ดเพื่อทำความสะอาดไดเรกทอรีที่มีอยู่สกปรกโดยไม่ต้องลบไฟล์ที่ไม่เกี่ยวข้องที่ระบุใน gitignore
Ray Foss

1
นี่คือสิ่งที่ใช้งานได้จริงสำหรับฉันซึ่งตรงข้ามกับคำตอบ @ cmcginty
แน่นอน

4
นี่ไม่เทียบเท่ากับ git-clone - สิ่งที่ขาดหายไปคือข้อมูลต้นน้ำสำหรับสาขาหลัก git branch --set-upstream-to=origin/master masterนี้สามารถแก้ไขได้โดยการเพิ่ม
Slaven Rezic

รุ่นนี้ใช้งานได้สำหรับฉันเพียงแค่ทำการรีเซ็ต git
Frédéric Klee

29

คำเตือน - สิ่งนี้อาจเขียนทับไฟล์ได้

git init     
git remote add origin PATH/TO/REPO     
git fetch     
git checkout -t origin/master -f

แก้ไขจากคำตอบของ @ cmcginty - หากไม่มี -f ก็ไม่ได้ผลสำหรับฉัน


แน่นอนคุณต้องเช็คเอาต์ไฟล์ทั้งหมดหลังจากนี้ด้วยgit checkout .?
Chris Stryczynski

25

นี่คือสิ่งที่ฉันทำเมื่อฉันมีปัญหาเดียวกัน (อย่างน้อยฉันก็คิดว่ามันเป็นปัญหาเดียวกัน) git initฉันเดินเข้าไปในไดเรกทอรีและวิ่ง

เนื่องจากฉันไม่ต้องการให้ไฟล์ในไดเรกทอรี A ตามมาด้วย git ฉันจึงแก้ไข. gitignore และเพิ่มไฟล์ที่มีอยู่ลงไป หลังจากนี้ฉันก็วิ่งgit remote add origin '<url>' && git pull origin masterเอตวอยเอ้อ B ถูก "โคลน" เป็น A โดยไม่ต้องสะดุด


2
เทคนิคนี้ไม่ทำงานในไดเรกทอรีที่ไม่ว่างเปล่าเมื่อไฟล์ขาเข้ามีอยู่แล้ว (ตามคำถามเดิมอธิบาย)
Araxia

11

ฉันใช้สิ่งนี้เมื่อไม่นานมานี้ต้องการคำสั่งที่อาจทำลายได้น้อยที่สุด:

cd existing-dir
git clone --bare repo-to-clone .git
git config --unset core.bare
git remote rm origin
git remote add origin repo-to-clone
git reset

และvoilá!


10

อีกสูตรง่ายๆที่ดูเหมือนจะทำงานได้ดีสำหรับฉัน:

git clone --bare $URL .git
git config core.bare false

กรณีการใช้งานหลักของฉันสำหรับการตรวจสอบไดเรกทอรีที่มีไฟล์ที่มีอยู่คือการควบคุม Unix dotfiles ด้วย Git ในบัญชีใหม่โฮมไดเร็กตอรี่จะมีไฟล์บางไฟล์อยู่แล้วซึ่งอาจเป็นไฟล์ที่ฉันต้องการได้จาก Git


1
ที่เก็บของเปลือยกำลังตั้งค่าแตกต่างกันเล็กน้อยและในขณะที่ใช้งานได้ฉันจะไม่แนะนำ :)
ThorSummoner

1
คุณจะเจาะจงมากขึ้นได้ไหม? ต่างกันอย่างไร
Ken Williams

1
ข้อแตกต่างสองข้อเท่านั้น: 1. ) .git/configไฟล์ระบุว่า repos นั้นว่างเปล่า 2. ) ไฟล์ที่จัดเก็บตามปกติ.gitจะถูกเก็บไว้ที่รูท (ซึ่งคุณเรียกว่า.git)
mozey

4
สิ่งเหล่านี้เป็นการเปลี่ยนแปลงที่โคลน.gitและการตั้งค่าcore.bareที่falseจะดูแลดังนั้นฉันยังคงรู้สึกดีกับวิธีนี้
Ken Williams

10

สิ่งนี้ใช้ได้กับฉัน:

cd existing_folder
git init
git remote add origin path_to_your_repo.git
git add .
git commit
git push -u origin master

6

ฉันมีปัญหาที่คล้ายกันกับเว็บไดเรกทอรี Apache ใหม่ (บัญชีที่สร้างด้วย WHM) ที่ฉันวางแผนไว้ว่าจะใช้เป็นเว็บเซิร์ฟเวอร์ชั่วคราว ฉันต้องเริ่มโคลนโครงการใหม่ด้วยรหัสฐานที่นั่นและปรับใช้การเปลี่ยนแปลงเป็นระยะโดยดึงจากที่เก็บ

ปัญหาคือว่าบัญชีมีไฟล์เซิร์ฟเวอร์เว็บเช่น:

.bash_history
.bash_logout
.bash_profile
.bashrc
.contactemail
.cpanel/
...

... ที่ฉันไม่ต้องการลบหรือกระทำการกับที่เก็บของฉัน ฉันต้องการให้พวกเขาอยู่ที่นั่นโดยไม่มีการควบคุมและไม่ได้ติดตาม

ฉันทำอะไรลงไป:

ฉันไปที่เว็บโฟลเดอร์ (มีอยู่ _ โฟลเดอร์):

cd /home/existing_folder

แล้ว:

git init
git remote add origin PATH/TO/REPO
git pull origin master
git status

มันแสดง (ตามที่คาดไว้) รายการของไฟล์ที่ไม่ได้จัดฉาก - ไฟล์ที่มีอยู่แล้วในตอนแรกจากบัญชีเว็บ cPanel ของฉัน

ขอบคุณบทความนี้ฉันเพิ่งเพิ่มรายการไฟล์เหล่านั้นไปที่:

**.git/info/exclude**

ไฟล์นี้คล้ายกับ.gitignoreไฟล์ช่วยให้คุณสามารถละเว้นไฟล์จากการจัดฉาก หลังจากนี้ฉันไม่มีอะไรจะทำใน. git / directory - มันทำงานได้เหมือนส่วนตัว.gitignoreที่ไม่มีใครเห็น

ตอนนี้ตรวจสอบgit statusผลตอบแทน:

On branch master
nothing to commit, working tree clean

ตอนนี้ฉันสามารถปรับใช้การเปลี่ยนแปลงกับเว็บเซิร์ฟเวอร์นี้ได้โดยเพียงดึงจากที่เก็บ git ของฉัน หวังว่านี่จะช่วยให้นักพัฒนาเว็บบางคนสร้างเซิร์ฟเวอร์การแสดงได้ง่าย



4

บางทีฉันอาจจะเข้าใจผิดคำถามของคุณ แต่มันจะไม่ง่ายถ้าคุณคัดลอก / ย้ายไฟล์จาก A ไปยัง git repo B และเพิ่มสิ่งที่จำเป็นด้วยgit add ?

อัปเดต: จาก git doc:

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

แหล่งที่มา: http://git-scm.com/docs/git-clone


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

สุจริตฉันไม่เห็นจุดของการพัฒนาในสภาพเช่นนี้ คุณไม่สามารถใช้การดำเนินการสาขาและผสานได้หรือไม่ หรือมีคลังเก็บย่อยที่มีการอ้างอิงภายนอก? ทำไมคุณต้องการพึ่งพา "เช็คเอาต์ git" เดียว?
Roberto Aloi

5
"การชำระเงิน git เดียว" ไม่ใช่จุดของการทดสอบทั้งหมด เป็นเพียงแค่นี้เป็นวิธีที่มันเป็นและเราต้องการวิธีที่จะก้าวไปข้างหน้า ฉันอัปเดตคำถามเดิมด้วยโซลูชันที่ดูเหมือนใช้งานได้ ฉันขอขอบคุณข้อเสนอแนะ
Dale Forester

3
มีหลายกรณีที่ถูกต้องตามกฎหมายสำหรับเรื่องนี้ - ฉันมีแผนผังโฟลเดอร์ที่ซับซ้อนที่ต้องทำการติดตั้งก่อนที่แหล่งที่มาของโครงการของฉันสามารถติดตั้งได้และโครงสร้างโฟลเดอร์นั้นมีงานลิขสิทธิ์ที่ไม่สามารถจัดเก็บใน GitHub ได้
BrainSlugs83

3

ฉันกำลังมองหาสิ่งที่คล้ายกันและนี่คือสิ่งที่ฉันมาด้วย:

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

  1. ไปที่เว็บทรีและเรียกใช้ git init
  2. ไปที่ตำแหน่งที่ต้องการของที่เก็บและรัน: git clone --bare /path/to/web/repo
  3. แก้ไขไฟล์กำหนดค่าใน repo ระยะไกลของฉันและลบ [remote "origin"]ส่วน
  4. เพิ่ม[remote "origin"]ส่วนใน. git / config ในแผนผังเว็บที่ชี้ไปยัง repo ระยะไกลใหม่

ฉันชอบสูตรนี้มาก
dland

git clone --bareนี่เป็นฟุ่มเฟือยและอ้อมค้อม ทำไมไม่git remote add origin <URL>เริ่มแรกเลยล่ะ?
Araxia

3

สิ่งนี้ใช้ได้สำหรับฉัน, แต่คุณควรรวมไฟล์ที่เก็บข้อมูลระยะไกลเข้ากับไฟล์ในเครื่อง:

git init
git remote add origin url-to-git
git branch --set-upstream-to=origin/master master
git fetch
git status

1

ฉันชอบคำตอบของ Daleและฉันก็เพิ่ม

git clone --depth 2 --no-checkout repo-to-clone existing-dir/existing-dir.tmp
git branch dev_new214
git checkout dev_new214
git add .
git commit
git checkout dev
git merge dev_new214

ความลึกตื้นเขินหลีกเลี่ยง dev ต้นพิเศษมากขึ้น สาขาใหม่ทำให้เรามีประวัติภาพที่ดีว่ามีรหัสใหม่จากเซิร์ฟเวอร์นี้ที่วางไว้นั่นคือการใช้งานที่สมบูรณ์แบบในความคิดของฉัน ฉันขอขอบคุณความเข้าใจที่ดีของทุกคนที่โพสต์ที่นี่


0

ฉันมีปัญหาเดียวกันเมื่อพยายามโคลนถึง c / code

แต่โฟลเดอร์นี้มีโครงการทั้งหมด

ฉันสร้างโฟลเดอร์ใหม่ใน c / code / newproject และทำการแมปโคลนของฉันไปที่โฟลเดอร์นี้

git สำหรับเดสก์ท็อปแล้วถามผู้ใช้ของฉันแล้วโคลนดี

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