ฉันมีสำเนาการทำงานของโครงการโดยไม่มีข้อมูลเมตาควบคุมแหล่งที่มา ตอนนี้ฉันต้องการทำคอมไพล์ git-clone ในโฟลเดอร์นี้และทำการเปลี่ยนแปลงในเครื่องของฉัน
git-clone ไม่อนุญาตให้ฉันโคลนเข้าไปในโฟลเดอร์ที่มีอยู่ การปฏิบัติที่ดีที่สุดที่นี่คืออะไร?
ฉันมีสำเนาการทำงานของโครงการโดยไม่มีข้อมูลเมตาควบคุมแหล่งที่มา ตอนนี้ฉันต้องการทำคอมไพล์ git-clone ในโฟลเดอร์นี้และทำการเปลี่ยนแปลงในเครื่องของฉัน
git-clone ไม่อนุญาตให้ฉันโคลนเข้าไปในโฟลเดอร์ที่มีอยู่ การปฏิบัติที่ดีที่สุดที่นี่คืออะไร?
คำตอบ:
ซึ่งสามารถทำได้โดยการโคลนไปยังไดเรกทอรีใหม่แล้วย้าย.gitไดเรกทอรีไปยังไดเรกทอรีที่มีอยู่ของคุณ
หากไดเรกทอรีที่มีอยู่ของคุณชื่อ "รหัส"
git clone https://myrepo.com/git.git temp
mv temp/.git code/.git
rm -rf temp
สิ่งนี้สามารถทำได้โดยไม่ต้องชำระเงินระหว่างคำสั่ง clone ข้อมูลเพิ่มเติมสามารถพบได้ที่นี่
git cloneเป็นคำสั่งแรกไม่จำเป็นต้องมีคำสั่งชำระเงินเพิ่มเติม หากคุณใช้บางอย่างเช่นgit clone --no-checkoutในขั้นตอนแรกแทนหลังจากย้ายไดเรกทอรี. git แล้วคุณจะต้องใช้git reset HEADเพื่อบอก git ว่าไฟล์ยังไม่ถูกลบ
git statusใช่คอมไพล์จะรู้เกี่ยวกับการแก้ไขไฟล์และมันจะเป็นไปได้ที่จะเห็นการเปลี่ยนแปลงโดยใช้คอมไพล์ปกติคำสั่งเช่น
อย่าโคลนดึงข้อมูลแทน ในธุรกรรมซื้อคืน:
git init
git remote add origin $url_of_clone_source
git fetch origin
git checkout -b master --track origin/master # origin/master is clone's default
จากนั้นคุณสามารถรีเซ็ตต้นไม้เพื่อให้ได้สิ่งที่คุณต้องการ:
git reset origin/master # or whatever commit you think is proper...
และคุณเป็นเหมือนโคลน
คำถามที่น่าสนใจที่นี่ (และคำถามที่ไม่มีคำตอบ): วิธีการค้นหาว่าต้นไม้ที่เปลือยเปล่าของคุณนั้นมีพื้นฐานมาจากไหน
ต่อไปนี้ฉันทำเพื่อชำระเงินที่สาขาหลักในไดเรกทอรีที่มีอยู่:
git init
git remote add origin [my-repo]
git fetch
git checkout origin/master -ft
-tตั้งค่าสถานะที่นี่
ฉันต้องการgit cloneไปยังไดเรกทอรีใหม่และคัดลอกเนื้อหาของไดเรกทอรีที่มีอยู่ไปยังโคลนใหม่
git clone wherever tmp && git mv tmp/.git . && rm -rf tmpกล่าวอีกนัยหนึ่งการย้าย.gitdir ออกจากโคลนชั่วคราวนั้นดูง่ายกว่าการทำความสะอาดแผนผังการทำงานของโคลนและคัดลอกไฟล์ที่มีอยู่ที่นั่น
git mv tmp/.git .ส่งคืนให้fatal: cannot move directory over file, source=tmp/.git, destination=.gitฉัน ใครรู้ว่าปัญหาคืออะไร?
mv, ไม่ใช่git mv; แม้ว่านี่จะไม่ได้อธิบายว่าทำไมคุณถึงมี.gitไฟล์อยู่แล้ว (ที่มีgitdir: some/path/to/a/git-dirคำว่า“ gitfile” ถ้ามันไม่อยู่ที่นั่นคุณก็จะเห็นมันfatal: Not a git repository (or any of the parent directories): .gitแทน)
การใช้ไดเรกทอรีชั่วคราวนั้นใช้ได้ แต่จะทำงานได้ถ้าคุณต้องการหลีกเลี่ยงขั้นตอนนั้น จากรูทของไดเรกทอรีทำงานของคุณ:
$ rm -fr .git
$ git init
$ git remote add origin your-git-url
$ git fetch
$ git reset --mixed origin/master
git reset --hard origin/masterจะลบไฟล์ในเครื่องใด ๆ
hardและmixedเป็นที่ผสมจะทำให้การเปลี่ยนแปลงในท้องถิ่น (ดังนั้นหากคุณในภายหลังพยายามที่จะดึงมันจะแสดงให้คุณเช่นไม่สามารถดึงกับ rebase:. คุณมีการเปลี่ยนแปลง unstaged โปรดกระทำหรือซ่อนพวกเขา ) ในขณะที่ยากจะยกเลิกการเปลี่ยนแปลงในท้องถิ่นเหล่านั้น
git clone your_repo tmp && mv tmp/.git . && rm -rf tmp && git reset --mixed
git reset --hardจะทำให้เกิดการเปลี่ยนแปลงไฟล์ในเครื่องโดยเฉพาะไม่ใช่สิ่งที่ OP นี้ร้องขอ --mixedควรใช้แทน
หากต้องการโคลน repo git ลงในไดเรกทอรีว่างที่มีอยู่ทำต่อไปนี้:
cd myfolder
git clone https://myrepo.com/git.git .
แจ้งให้ทราบ.ในตอนท้ายของgit cloneคำสั่งของคุณ ที่จะดาวน์โหลด repo ลงในไดเรกทอรีการทำงานปัจจุบัน
fatal: destination path '.' already exists and is not an empty directory.
มีคำตอบมากมายที่ต้องทำในแบบที่ OP ถาม แต่น่าสังเกตว่าการทำในทางตรงกันข้ามนั้นง่ายกว่า:
git clone repo-url tmp/
cp -R working/ tmp/
ตอนนี้คุณมีสถานะเป้าหมายที่ต้องการ - โคลนนิ่งสด + การเปลี่ยนแปลงในท้องถิ่น
มีสองวิธีในการนี้ ถ้าเป็นไปได้ฉันจะเริ่มด้วยโฟลเดอร์สะอาดสำหรับไดเรกทอรีงานคอมไพล์ใหม่ของคุณแล้วคัดลอกเวอร์ชันของสิ่งต่าง ๆ ในภายหลัง นี่อาจดูเหมือน *:
mv $dir $dir.orig
git clone $url $dir
rsync -av --delete --exclude '.git' $dir.orig/ $dir/
rm -rf $dir.orig
ณ จุดนี้คุณควรมีสำเนาการทำงานที่สะอาดหมดจดพร้อมโฟลเดอร์การทำงานก่อนหน้าของคุณเป็นไดเรกทอรีการทำงานปัจจุบันดังนั้นการเปลี่ยนแปลงใด ๆ รวมถึงการลบไฟล์จะปรากฏขึ้นบนเรดาร์หากคุณเรียก git statusรวมถึงการลบไฟล์จะปรากฏขึ้นบนจอเรดาร์ถ้าคุณทำงาน
ในทางกลับกันถ้าคุณต้องทำอย่างนั้นจริง ๆ คุณสามารถได้ผลลัพธ์เดียวกันกับสิ่งนี้:
cd $dir
git clone --no-checkout $url tempdir
mv tempdir/.git .
rmdir tempdir
git reset --mixed HEAD
ไม่ว่าจะด้วยวิธีใดสิ่งแรกที่ฉันจะทำคือทำอะไรบางอย่างเช่น git stashเพื่อรับสำเนาการเปลี่ยนแปลงในพื้นที่ทั้งหมดของคุณจากนั้นคุณสามารถนำไปใช้ใหม่และทำงานผ่านสิ่งที่คุณต้องการจะทำ
* ทั้งสองตัวอย่างสมมติว่าคุณเริ่มต้นจากเชลล์ในไดเรกทอรีหลักของโครงการของคุณ
นี่คือวิธีที่ดีที่สุดของทั้งหมดที่ฉันเจอ
โคลนเฉพาะโฟลเดอร์. git ของที่เก็บ (ไม่รวมไฟล์ตามที่มีอยู่existing-dir) ลงในไดเรกทอรีชั่วคราวที่ว่างเปล่า
git clone --no-checkout repo-path-to-clone existing-dir/existing-dir.tmp // อาจต้องการ - no-hardlinks สำหรับการโคลน repo ในพื้นที่ย้ายโฟลเดอร์. git ไปยังไดเรกทอรีด้วยไฟล์ สิ่งนี้ทำให้existing-dirrepo คอมไพล์
mv existing-dir/existing-dir.tmp/.git existing-dir/ลบไดเรกทอรีชั่วคราว
rmdir existing-dir/existing-dir.tmp
cd existing-dir
Git คิดว่าไฟล์ทั้งหมดจะถูกลบซึ่งจะเปลี่ยนสถานะของ repo เป็น HEAD
คำเตือน: การเปลี่ยนแปลงใด ๆ ในตัวเครื่องของไฟล์จะหายไป
git reset --mixed HEADหากคุณกำลังใช้อย่างน้อยคอมไพล์ 1.7.7 (ซึ่งสอนตัวเลือก) เพื่อเปิดไดเรกทอรีปัจจุบันเป็นสำเนาการทำงาน:clone--config
git clone example.com/my.git ./.git --mirror --config core.bare=false
สิ่งนี้ทำงานโดย:
.gitโฟลเดอร์--mirror ทำให้โคลนใหม่ลงในโฟลเดอร์เมตาดาต้าล้วนๆ .gitต้องการ--config core.bare=falseตอบโต้นัยbare=trueของ--mirrorตัวเลือกดังนั้นจึงอนุญาตให้ที่เก็บมีไดเรกทอรีการทำงานที่เกี่ยวข้องและทำหน้าที่เหมือนโคลนปกติสิ่งนี้จะไม่ทำงานหากมี.gitเมตาดาต้าไดเรกทอรีอยู่ในไดเรกทอรีที่คุณต้องการเปลี่ยนเป็นสำเนาที่ใช้งานได้
[core]ส่วนของการตั้งค่าในท้องถิ่นรวมทั้งและbare = true bare = falseปัญหาที่มากขึ้นคือมันจะมีค่าที่ไม่ถูกต้องสำหรับoriginรีโมตโดยมี[remote "origin"]ส่วนรวมถึงmirror = trueและข้อมูลจำเพาะการดึงข้อมูลที่จะทำงานไม่ถูกต้องกับสำเนาที่ใช้งานได้ หลังจากแก้ไขปัญหาเหล่านี้แล้วการโคลนนิ่งตามปกติและการย้ายสำเนาการทำงานใหม่.gitจะมีประสิทธิภาพมากขึ้น
โดยปกติฉันจะโคลนที่เก็บเริ่มต้นก่อนจากนั้นย้ายทุกอย่างในโฟลเดอร์ที่มีอยู่ไปยังที่เก็บเริ่มต้น มันใช้งานได้ทุกครั้ง
ข้อดีของวิธีนี้คือคุณจะไม่พลาดที่เก็บข้อมูลเริ่มต้นรวมถึง README หรือ. gitignore
คุณยังสามารถใช้คำสั่งด้านล่างเพื่อทำตามขั้นตอนต่อไปนี้:
$ git clone https://github.com/your_repo.git && mv existing_folder/* your_repo
คุณสามารถทำได้โดยพิมพ์บรรทัดคำสั่งต่อไปนี้ซ้ำ:
mkdir temp_dir // Create new temporary dicetory named temp_dir
git clone https://www...........git temp_dir // Clone your git repo inside it
mv temp_dir/* existing_dir // Move the recently cloned repo content from the temp_dir to your existing_dir
rm -rf temp_dir // Remove the created temporary directory
เพียงแค่ใช้ ในตอนท้ายของgit cloneคำสั่ง (อยู่ในไดเรกทอรีนั้น) ดังนี้:
cd your_dir_to_clone_in/
git clone git@github.com/somerepo/ .