Kho lưu trữ Git của tôi nằm trong thư mục gốc sai. Tôi có thể di chuyển nó không? (../ thay vì ./)


118

Bằng cách nào đó khi tôi chỉnh sửa git initdự án mới nhất của mình cách đây một tháng hoặc lâu hơn, tôi đã chạy lệnh trong thư mục cao hơn thư mục gốc của dự án.

Vì vậy, kho lưu trữ của tôi là trong ./projectthư mục chứ không phải ./project/my-new-projectthư mục. Tôi không biết làm thế nào mà tôi không nhận ra vấn đề sớm hơn, nhưng tôi chưa bao giờ tìm kiếm thư mục .git cho đến bây giờ.

Có cách nào mà không giết dự án của tôi, để di chuyển kho lưu trữ đến thư mục thích hợp và sau đó cho git biết cơ sở mới của dự án là gì không? Chỉ di chuyển thư mục không hoạt động. Git cho rằng tất cả các tệp đã bị xóa.

Câu trả lời:


19

Có lẽ điều đơn giản nhất, trừ khi bạn đã tạo một số lịch sử mà bạn muốn lưu, sẽ là chỉ cần xóa .gitthư mục con và thực hiện lại init trong đúng thư mục.

Nếu bạn đã sử dụng git để giải quyết vấn đề, thì bất kỳ giải pháp nào cũng nhất thiết phải để lại rất nhiều mục lịch sử "đã chuyển tệp này vào đây" mà không thực sự thay đổi, nhưng bạn đang sửa lỗi tại thời điểm tạo. Tốt hơn là chỉ cần tạo ra nó đúng.


2
Tôi hiểu bạn đang nói gì, nhưng bất kỳ hành động in-git nào bạn thực hiện để sửa lỗi này sẽ dẫn đến việc để lại một loạt lịch sử "đã chuyển tệp này vào đây" không thực sự thay đổi, nhưng bạn đang sửa một lỗi tại thời điểm tạo. Tốt hơn là chỉ cần tạo ra nó đúng.
TED

8
Điều này làm hỏng rất nhiều thứ. stackoverflow.com/a/3247756/825364 là một cách tốt hơn nhiều để làm điều đó.
Steve Tauber

2
Chà, lưu một số lịch sử là những gì Git được sử dụng. Có lẽ chúng ta chỉ nên xóa thư mục con .git và gỡ cài đặt Git khỏi hệ thống của mình? Sử dụng ftp-server thay vì vcs có lẽ là điều đơn giản nhất!
Gherman

2
câu trả lời dưới đây là một cách tiếp cận tốt hơn nhiều vì nó giữ lại tất cả lịch sử
BigMikeW

2
Vì vậy, với tôi, tôi đã làm điều này và ngay lập tức nhận ra sai lầm của mình. mà không phải lo lắng về bất kỳ thay đổi nào, đây là cách dễ nhất để trở lại một phương tiện chặn sạch sẽ.
Mike

261

Tôi gặp phải vấn đề ngược lại - phải chuyển git root sang thư mục mẹ (từ project / src sang project) Trước sự ngạc nhiên tột độ của tôi, cách sau đã hoạt động !!

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

git đã thông minh phát hiện rằng tất cả các tệp mới đều được đổi tên thành phiên bản cũ và không có lịch sử nào bị mất

Bạn có thể thử một cái gì đó tương tự ... di chuyển thư mục .git và thêm lại các tệp trước khi thực hiện


8
Điều này làm việc hoàn hảo cho tôi. Tôi cũng đã di chuyển các tệp .git * config khác từ thư mục như .gitigore
Relequestual

7
Thưa ngài, ngài là một vị cứu tinh. Điều này thực sự hoạt động. Cảm ơn bạn.
Radu Murzea

1
Ngoài ra, tôi git rm'dcác tệp từ vị trí cũ của chúng, vì vậy git status(chính xác) đã kết thúc báo cáo một số hoạt động đổi tên. Tôi càng làm việc với git, tôi càng thích nó.
ssc

7
@Mike, điều này sẽ được đánh dấu là câu trả lời được chấp nhận. Đó là một giải pháp ưa thích để kích hoạt lại vì bạn không bị mất lịch sử. Nếu bạn không tin tôi, số phiếu ủng hộ đã tự nói lên điều đó.
Joseph Mở

3
Cảm ơn bạn! Nó hoạt động với tôi, nhưng tôi phải làm một số việc nữa: 1. Trước khi cam kết, tôi đã cập nhật .gitignorevà chạy git add -Atrong thư mục gốc; sau đó, git hiển thị chính xác tất cả các tệp renamedthay vì deleted. 2. Vì tôi sử dụng mô-đun con, tôi phải chuyển .gitmodulesđến thư mục gốc mới và cập nhật đường dẫn mô-đun con trong các tệp cấu hình git khác nhau. Để tìm các tập tin để thay đổi tôi chạygrep -nrI --color 'old/path/to/submodule' .
Guido Walter Pettinari

43

Điều này đã làm việc cho tôi, và giữ cho tất cả lịch sử của tôi nguyên vẹn. Từ thư mục gốc không chính xác (gốc mà bạn vô tình khởi tạo repo):

Di chuyển thư mục:

mv .git thecorrectfolder/

Khởi tạo lại git repo:

cd thecorrectfolder/
git init

Thêm lại tất cả các tệp, cam kết và đẩy:

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

Làm xong! Lấy cho mình một cốc bia.

Khi bạn cam kết repo git sau khi khởi tạo lại, bạn sẽ nhận được một loạt kết quả giống như sau:

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

Nói cách khác, tất cả các tham chiếu của bạn từ thư mục mẹ và được đổi tên để sử dụng đúng thư mục.


Cảm ơn! Phương pháp này chính xác là những gì tôi cần!
Giel Berkers

Điều này làm việc cho tôi, nhưng nó hơi xấu xí. Theo như git có liên quan, tôi không 'di chuyển' gì cả, tôi chỉ xóa hàng trăm tệp và sau đó thêm hàng trăm tệp khác, giống hệt nhau.
bjmc

6
git init là không bắt buộc và phần còn lại giống với câu trả lời của tôi đã được gửi trước bạn nhiều năm: stackoverflow.com/a/3247756/391753
Abhishek Anand

35

git filter-branchcho phép bạn viết lại lịch sử theo cách đó. Các git filter-branchtrang người đàn ông thậm chí còn có trường hợp của bạn là một ví dụ :

Để viết lại kho lưu trữ để trông như thể foodir / đã là gốc dự án của nó và hủy tất cả lịch sử khác:

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

Bạn có thể muốn git clonerepo vào một thư mục con mới trước (hoặc sau?) git filter-branchChạy. ( .git/Sao chép trước nhánh bộ lọc và chạy nhánh bộ lọc trên bản sao mới sẽ có lợi thế là để nguyên bản gốc như một bản sao lưu trong trường hợp có sự cố.)


1
Điều này không "loại bỏ tất cả lịch sử khác " (đề xuất .gitrepo vẫn ở cấp cao nhất trong khi các thư mục con trở thành "được coi là thư mục gốc") - điều này theo nghĩa đen sẽ loại bỏ tất cả các tệp khác trong repo và di chuyển tất cả subdirectory/*các tệp lên thư mục gốc .
Louis Maddox

Câu trả lời tuyệt vời, nhưng hãy nhớ rằng nếu có tệp .gitignore (nếu được theo dõi), nó sẽ bị mất với thao tác này. Ngoài ra, bạn sẽ cần phải git push --forcecập nhật kho lưu trữ ngược dòng sau đó.
waldyrious

12

Git có thể nhớ các tệp với hàm băm của chúng,

Chỉ cần di chuyển của bạn .gitđến thư mục gốc và yêu gitcầu ghi nhớ tất cả các thay đổi tệp với --alltùy chọn.

$ 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

Sử dụng git-mvđể di chuyển các tệp của bạn "lên" đến vị trí thích hợp, sau đó git-rmlà thư mục "dự án mới của tôi".


Đó là một cách khác. Tôi không muốn di chuyển tất cả các tệp của mình xuống thư mục mà git đang ở (có rất nhiều thứ khác ở đó ... sẽ rất khó chịu) và sau đó chuyển git lên. Tôi muốn di chuyển kho lưu trữ lên thư mục gốc của dự án của mình.
Mike

2

Tôi đến đây để tìm cách di chuyển kho lưu trữ của mình đến bất kỳ đâu .

Trong trường hợp, tôi không phải là người duy nhất, đây là những gì tôi đã làm cuối cùng:

https://git.wiki.kernel.org/index.php/GitFaq#How_do_I_clone_a_repository_with_all_remotely_tracked_braffs.3F Tôi "git clone --mirror" đã sao chép kho của tôi và sau đó bảo nó không được để trống nữa, vì vậy các tệp đã hiển thị trong thư mục mới đó. (Sau đó kiểm tra xem tệp và nhật ký đã xuất hiện hay chưa.) Giữ repo cũ một lúc, đề phòng ...

Bằng cách đó, tôi có thể di chuyển repo của mình mà không làm mất lịch sử.

Lời chào tốt đẹp nhất, Dinah


Hãy sửa cho tôi nếu tôi sai, nhưng có vẻ như bạn có thể đạt được điều đó bằng cách chỉ cần di chuyển thư mục kho lưu trữ đến vị trí được chỉ định của nó mà không sử dụng gì ngoài các công cụ hệ thống tệp trần, như mv /path/to/the/old/location/of/the/repo /path/to/the/new/location/of/the/repo.
cueedee

2

Vừa trải qua cùng một vấn đề này, giải pháp cuối cùng của tôi là:

  1. Di chuyển thư mục .git đến nơi cần thiết.
  2. Thay đổi thư mục thành thư mục mà tôi vừa chuyển .git vào
  3. Đặt lại nội dung thư mục về những gì git nghĩ rằng nó phải là: git reset --hard HEAD
  4. Kiểm tra xem nội dung có khớp với nội dung không bằng kdiff3 hoặc một công cụ so sánh khác
  5. Xóa các tệp hiện chưa được tạo phiên bản tại vị trí cũ.

Nó hoạt động như một phép thuật mà không ảnh hưởng đến lịch sử. - NB Nếu bạn đã thực hiện một số thay đổi, hãy chắc chắn cam kết chúng trước khi di chuyển thư mục .git.


-3

Có hai cách ở đây:

  1. cd TheWrongDirectory rm -rf .git

  2. chỉ cần XÓA thư mục .git và cd vào đúng thư mục.

Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.