ที่เก็บ Git ของฉันอยู่ในไดเรกทอรีรากที่ไม่ถูกต้อง ฉันสามารถย้ายได้หรือไม่? (../ แทน ./)


118

อย่างไรก็ตามเมื่อฉันgit initแก้ไขโปรเจ็กต์ล่าสุดของฉันเมื่อหนึ่งเดือนก่อนฉันรันคำสั่งในไดเร็กทอรีหนึ่งไดเร็กทอรีที่สูงกว่ารูทของโปรเจ็กต์ของฉัน

ดังนั้นที่เก็บของฉันจึงอยู่ใน./projectไดเร็กทอรีไม่ใช่./project/my-new-projectไดเร็กทอรี ฉันไม่รู้ว่าฉันไม่รู้ปัญหาก่อนหน้านี้ได้อย่างไร แต่ฉันไม่เคยมองหาไดเรกทอรี. git เลยจนถึงตอนนี้

มีวิธีโดยไม่ต้องฆ่าโปรเจ็กต์ของฉันเพื่อย้ายที่เก็บไปยังไดเร็กทอรีที่เหมาะสมแล้วบอกคอมไพล์ว่าฐานใหม่ของโปรเจ็กต์คืออะไร แค่ย้ายไดเร็กทอรีก็ใช้ไม่ได้ Git คิดว่าไฟล์ทั้งหมดถูกลบแล้ว

คำตอบ:


19

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

หากคุณใช้คอมไพล์ในการแก้ปัญหาวิธีแก้ปัญหาใด ๆ ก็จำเป็นต้องทิ้งรายการประวัติ "ย้ายไฟล์นี้มาที่นี่" ไว้มากมายซึ่งไม่ได้เปลี่ยนแปลงจริง ๆ แต่คุณกำลังแก้ไขปัญหาในขณะสร้าง ดีกว่าแค่สร้างให้ถูกต้อง


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

8
นี่แบ่งของเยอะมาก stackoverflow.com/a/3247756/825364เป็นวิธีที่ดีกว่ามาก
Steve Tauber

2
การบันทึกประวัติบางส่วนเป็นสิ่งที่ Git ใช้ บางทีเราควรลบไดเร็กทอรีย่อย. git และถอนการติดตั้ง Git ออกจากระบบของเรา? การใช้ ftp-server แทน vcs น่าจะเป็นสิ่งที่ง่ายที่สุด!
Gherman

2
คำตอบด้านล่างเป็นแนวทางที่ดีกว่ามากเนื่องจากยังคงรักษาประวัติศาสตร์ไว้ทั้งหมด
BigMikeW

2
ดังนั้นสำหรับฉันฉันทำสิ่งนี้และตระหนักถึงความผิดพลาดของฉันทันที โดยไม่ต้องกังวลกับการเปลี่ยนแปลงใด ๆ นี่เป็นวิธีที่ง่ายที่สุดในการกลับสู่กระดานชนวนที่สะอาด
Mike

261

ฉันมีปัญหาตรงข้าม - ต้องเปลี่ยน git root ไปที่ไดเร็กทอรีหลัก (จาก project / src เป็น project) เพื่อความประหลาดใจอย่างยิ่งของฉันสิ่งต่อไปนี้ใช้งานได้ !!

src$ mv .git ../ 
src$ cd ..
project$ git add src
project$ git commit -a

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

คุณสามารถลองสิ่งที่คล้ายกัน ... ย้ายโฟลเดอร์. git และเพิ่มไฟล์อีกครั้งก่อนที่จะคอมมิต


8
สิ่งนี้ใช้ได้ผลอย่างสมบูรณ์สำหรับฉัน ฉันยังย้ายไฟล์. git * config อื่น ๆ จากไดเร็กทอรีเช่น. gitigore
Relequestual

7
ท่านที่รักของฉันคุณเป็นผู้ช่วยชีวิต สิ่งนี้ได้ผลจริงๆ ขอบคุณ.
Radu Murzea

1
นอกจากนี้ฉันgit rm'dยังไฟล์จากตำแหน่งเดิมดังนั้นgit status(อย่างถูกต้อง) จึงรายงานการดำเนินการเปลี่ยนชื่อจำนวนมาก ยิ่งฉันทำงานกับคอมไพล์มากเท่าไหร่ฉันก็ยิ่งชอบมากขึ้นเท่านั้น
ssc

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

3
ขอบคุณ! มันใช้ได้ผลสำหรับฉัน แต่ฉันต้องทำอีกสองสามอย่าง: 1. ก่อนที่จะตกลงฉันอัปเดต.gitignoreและรันgit add -Aในโฟลเดอร์รูท หลังจากนี้ git จะแสดงไฟล์ทั้งหมดอย่างถูกต้องrenamedแทนที่จะเป็นไฟล์deleted. 2. เนื่องจากฉันใช้โมดูลย่อยฉันจึงต้องย้าย.gitmodulesไปยังรูทใหม่และอัปเดตเส้นทางโมดูลย่อยในไฟล์คอนฟิกูเรชัน git ต่างๆ หากต้องการค้นหาไฟล์ที่จะแก้ไขฉันวิ่งgrep -nrI --color 'old/path/to/submodule' .
Guido Walter Pettinari

43

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

ย้ายโฟลเดอร์:

mv .git thecorrectfolder/

เริ่มต้น git repo อีกครั้ง:

cd thecorrectfolder/
git init

เพิ่มไฟล์ทั้งหมดอีกครั้งคอมมิตและพุช:

git add .
git commit -am 'fixing things'
git push origin master

ทำ! ดื่มเบียร์ด้วยตัวเอง

เมื่อคุณคอมมิต git repo หลังจากเริ่มต้นใหม่คุณจะได้ผลลัพธ์มากมายที่มีลักษณะดังนี้:

rename {ethanode/coffee => coffee}/app.coffee (100%)

กล่าวอีกนัยหนึ่งคือการอ้างอิงทั้งหมดของคุณจากโฟลเดอร์หลักและถูกเปลี่ยนชื่อเพื่อใช้โฟลเดอร์ที่ถูกต้อง


ขอบคุณ! วิธีนี้คือสิ่งที่ฉันต้องการ!
Giel Berkers

สิ่งนี้ใช้ได้ผลสำหรับฉัน แต่มันน่าเกลียดเล็กน้อย เท่าที่เกี่ยวข้องกับคอมไพล์ฉันไม่ได้ 'ย้าย' อะไรเลยฉันเพิ่งลบไฟล์หลายร้อยไฟล์จากนั้นเพิ่มไฟล์อื่น ๆ ที่เหมือนกันอีกหลายร้อยไฟล์
bjmc

6
ไม่จำเป็นต้องใช้ git init และส่วนที่เหลือก็เหมือนกับคำตอบของฉันซึ่งส่งมาหลายปีก่อนหน้าของคุณ: stackoverflow.com/a/3247756/391753
Abhishek Anand

35

git filter-branchให้คุณเขียนประวัติศาสตร์ใหม่ด้วยวิธีนั้น git filter-branchหน้าคนยังมีกรณีของคุณเป็นตัวอย่าง :

หากต้องการเขียนที่เก็บใหม่ให้ดูเหมือนว่า foodir / เคยเป็นรูทโปรเจ็กต์และทิ้งประวัติอื่น ๆ ทั้งหมด:

git filter-branch --subdirectory-filter foodir -- --all

คุณอาจต้องการgit clonerepo ไปยังไดเร็กทอรีย่อยใหม่ก่อน (หรือหลัง?) การgit filter-branchรัน (การโคลนก่อน filter-branch และเรียกใช้ filter-branch บน clone ใหม่จะมีข้อได้เปรียบในการปล่อย.git/dir เดิมไว้เป็นข้อมูลสำรองในกรณีที่มีบางอย่างผิดพลาด)


1
สิ่งนี้ไม่ได้ "ทิ้งประวัติอื่น ๆ ทั้งหมด" (แนะนำให้.gitrepo อยู่ที่ระดับบนสุดในขณะที่ไดเรกทอรีย่อยกลายเป็น "คิดว่าเป็นราก") ซึ่งจะเป็นการทิ้งไฟล์อื่น ๆ ทั้งหมดใน repo อย่างแท้จริงและย้ายsubdirectory/*ไฟล์ทั้งหมดไปที่โฟลเดอร์ราก .
Louis Maddox

คำตอบที่ดี แต่โปรดทราบว่าหากมีไฟล์. gitignore (หากติดตาม) การดำเนินการนี้จะสูญหายไป นอกจากนี้คุณจะต้องทำการgit push --forceอัปเดตที่เก็บต้นน้ำหลังจากนี้
waldyrious

12

Git สามารถจำไฟล์ได้ด้วยแฮช

เพียงแค่ย้าย.gitไปที่ไดเรกทอรีรากและบอกgitให้จำไฟล์ทั้งหมดที่เปลี่ยนแปลงด้วย--allตัวเลือก

$ mv .git ../
$ cd ..
$ git add . --all 
$ git status // => you can see all the files recognized as renamed 100%
$ git commit -m "Moves repo to root directory."

3

ใช้git-mvเพื่อย้ายไฟล์ของคุณ "ขึ้น" ไปยังตำแหน่งที่เหมาะสมgit-rmตามด้วยไดเร็กทอรี "my-new-project"


มันเป็นวิธีอื่น ๆ ฉันไม่ต้องการย้ายไฟล์ทั้งหมดของฉันลงไปที่ไดเร็กทอรี git อยู่ (มีสิ่งอื่น ๆ อีกมากมายที่นั่น ... มันน่ารำคาญ) จากนั้นย้ายคอมไพล์ขึ้น ฉันต้องการย้ายที่เก็บไปยังไดเร็กทอรีรูทของโปรเจ็กต์ของฉัน
Mike

2

ผมมาที่นี่มองหาวิธีที่จะย้ายพื้นที่เก็บข้อมูลของฉันที่ใดก็ได้

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

https://git.wiki.kernel.org/index.php/GitFaq#How_do_I_clone_a_repository_with_all_remotely_tracked_branches.3F ฉัน "git clone --mirror" ดาสำเนาเปล่าของ repo ของฉันและหลังจากนั้นบอกว่าจะไม่เปลือยอีกต่อไปไฟล์จึงปรากฏขึ้น ในโฟลเดอร์ใหม่นั้น (จากนั้นตรวจสอบว่ามีไฟล์และบันทึกปรากฏขึ้นหรือไม่) เก็บ repo เก่าไว้สักครู่ในกรณีที่ ...

ด้วยวิธีนี้ฉันสามารถย้าย repo ของฉันโดยไม่เสียประวัติ

คำทักทายที่ดีที่สุด Dinah


แก้ไขฉันถ้าฉันผิด แต่ดูเหมือนว่าคุณสามารถทำได้โดยเพียงแค่ย้ายไดเร็กทอรีที่เก็บไปยังตำแหน่งที่กำหนดโดยใช้อะไรเลยนอกจากเครื่องมือระบบไฟล์เปล่าเช่นmv /path/to/the/old/location/of/the/repo /path/to/the/new/location/of/the/repo.
cueedee

2

หลังจากผ่านปัญหาเดียวกันนี้วิธีแก้ปัญหาในที่สุดของฉันคือ:

  1. ย้ายโฟลเดอร์. git ไปยังที่ที่ต้องการ
  2. เปลี่ยนไดเร็กทอรีไปยังโฟลเดอร์ที่ฉันเพิ่งย้าย. git ไป
  3. รีเซ็ตเนื้อหาโฟลเดอร์เป็น git ที่คิดว่าควรจะเป็น: git reset --hard HEAD
  4. ตรวจสอบว่าเนื้อหาตรงกับสิ่งที่ควรจะเป็นกับ kdiff3 หรือเครื่องมือเปรียบเทียบอื่น ๆ
  5. ลบไฟล์ที่ไม่มีเวอร์ชันตอนนี้ที่ตำแหน่งเก่า

มันทำงานได้เหมือนเวทมนตร์โดยไม่มีผลกระทบต่อประวัติศาสตร์ - หมายเหตุหากคุณได้ทำการเปลี่ยนแปลงบางอย่างให้แน่ใจว่าได้ทำการเปลี่ยนแปลงก่อนที่จะย้ายไดเร็กทอรี. git


-3

มีสองวิธีที่นี่:

  1. ซีดี TheWrongDirectory rm -rf .git

  2. เพียงแค่ลบโฟลเดอร์. git และ cd ไปยังไดเร็กทอรีที่ถูกต้อง

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