2009-12-16 43 views
90

Bằng cách nào đó khi tôi git init chỉnh sửa dự án mới nhất của tôi một tháng hoặc lâu hơn, tôi đã chạy lệnh trong thư mục một thư mục cao hơn thư mục gốc của dự án của tôi.Kho Git của tôi nằm trong thư mục gốc sai. Tôi có thể di chuyển nó? (../ thay vì ./)

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

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

Trả lời

10

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

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

+0

Vâng, đó là những gì tôi đang nghĩ. Nó sẽ không là một mất mát lớn để mất lịch sử đó, nhưng nó sẽ được tốt đẹp không để sửa chữa là tương đối dễ dàng. – Mike

+2

Tôi thấy những gì bạn đang nói, nhưng bất kỳ hành động nào trong git bạn thực hiện để sửa lỗi này sẽ kết thúc một loạt các lịch sử "di chuyển tệp này ở đây" mà không thực sự thay đổi, nhưng bạn sửa chữa một lỗi tại thời điểm tạo. Tốt hơn là chỉ cần tạo nó ngay. –

+6

Điều này phá vỡ rất nhiều thứ. http://stackoverflow.com/a/3247756/825364 là cách tốt hơn để làm điều đó. –

3

Sử dụng git-mv để di chuyển tệp của bạn "lên" đến vị trí thích hợp, sau đó git-rm thư mục "my-new-project".

+0

Đó là một cách khác.Tôi không muốn di chuyển tất cả các tập tin của tôi xuống đến thư mục git là trong (có tấn công cụ khác ở đó ... nó sẽ gây phiền nhiễu) và sau đó di chuyển git lên. Tôi muốn di chuyển kho lưu trữ đến thư mục gốc của dự án của tôi. – Mike

33

git filter-branch cho phép bạn viết lại lịch sử theo cách đó. Các git filter-branch man page thậm chí có trường hợp của bạn as an example:

Để viết lại kho để trông như thể foodir/đã gốc dự án của mình, và loại bỏ tất cả lịch sử khác:

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

Bạn có thể muốn git clone repo vào thư mục con mới trước (hoặc sau?) Khi chạy git filter-branch. (Nhân bản trước khi lọc-chi nhánh và chạy các bộ lọc-chi nhánh trên bản sao mới sẽ có lợi thế là để lại bản gốc .git/ dir tại chỗ như một bản sao lưu trong trường hợp một cái gì đó đi sai.)

+0

Làm việc hoàn hảo. – lepe

+1

Điều này không "loại bỏ tất cả các lịch sử *** khác" (gợi ý rằng '.git' repo vẫn ở mức cao nhất trong khi các thư mục con trở thành" tư tưởng là gốc ") - điều này sẽ loại bỏ tất cả các tệp khác trong repo và di chuyển tất cả các thư mục 'subdirectory/*' lên thư mục gốc. –

+0

Câu trả lời hay, 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 thực hiện 'git push --force' để cập nhật kho lưu trữ ngược dòng sau này. – waldyrious

195

Tôi đã có vấn đề ngược lại - đã phải chuyển thư mục gốc git vào thư mục mẹ (từ project/src sang project) Trước sự ngạc nhiên của tôi, những thứ sau đây đã làm việc !!

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

git khéo léo phát hiện ra rằng tất cả các file mới được đổi tên phiên bản của cái cũ và không có tiền sử 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 các tập tin một lần nữa trước khi cam kết

+6

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

+5

Thưa ngài, bạn là một vị cứu tinh cuộc sống. Điều này thực sự WORKS. Cảm ơn bạn. –

+1

Ngoài ra, tôi 'git rm'd' các tập tin từ vị trí cũ của họ, do đó,' 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

2

Tôi đến đây tìm cách di chuyển kho của mình ở 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_branches.3F tôi "git clone --mirror" da copy trần của repo của tôi và sau đó nói với nó để không bị trần nữa, vì vậy các tập tin xuất hiện trong thư mục mới đó. (Sau đó kiểm tra xem các tập tin và nhật ký đã xuất hiện chưa.) Giữ repo cũ trong một thời gian, chỉ trong trường hợp ...

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

Chúc mừng nhất, Dinah

32

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

Di chuyển thư mục:

mv .git thecorrectfolder/ 

Tái khởi tạo repo git:

cd thecorrectfolder/ 
git init 

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

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

Xong! Lấy cho mình một ly bia.

Khi bạn cam kết repo git sau khi tái khởi tạo, bạn sẽ nhận được một loạt các đầu ra mà trông như thế này:

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

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

+0

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

+0

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

+4

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

6

Git có thể nhớ các file với băm của họ,

Chỉ cần di chuyển của bạn .git đến thư mục gốc và nói git phải nhớ tất cả các file thay đổi với --all tù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." 
1

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

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

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

-2

Có hai cách đây:

  1. cd TheWrongDirectory rm -rf .git

  2. chỉ DELETE thư mục .git và cd vào thư mục bên phải.

Các vấn đề liên quan