Làm thế nào để di chuyển một kho lưu trữ git vào một thư mục khác và biến thư mục đó thành một kho lưu trữ git?


101

Tôi có một thư mục gitrepo1 . Thư mục này là một kho lưu trữ git.

  • Tôi muốn chuyển gitrepo1 này vào thư mục khác newrepo .

  • Thư mục newrepo phải là kho lưu trữ git mới không bị mất lịch sử git và phải chứa thư mục gitrepo1 .

  • Thư mục gitrepo1 bây giờ chỉ nên là một thư mục (bên trong newrepo ), không có bất kỳ .gitchỉ mục nào , tức là nó KHÔNG còn là một kho lưu trữ git độc lập hoặc một mô-đun con.

Tôi có thể làm cái này như thế nào?


9
mv girepo1 newrepo??
ddavison

Câu trả lời:


109

Nó rất đơn giản. Git không quan tâm đến tên thư mục của nó là gì. Nó chỉ quan tâm những gì bên trong. Vì vậy, bạn có thể chỉ cần làm:

# copy the directory into newrepo dir that exists already (else create it)
$ cp -r gitrepo1 newrepo

# remove .git from old repo to delete all history and anything git from it
$ rm -rf gitrepo1/.git

Lưu ý rằng việc sao chép khá đắt nếu kho lưu trữ lớn và có lịch sử lâu đời. Bạn cũng có thể tránh nó một cách dễ dàng:

# move the directory instead
$ mv gitrepo1 newrepo

# make a copy of the latest version
# Either:
$ mkdir gitrepo1; cp -r newrepo/* gitrepo1/  # doesn't copy .gitignore (and other hidden files)

# Or:
$ git clone --depth 1 newrepo gitrepo1; rm -rf gitrepo1/.git

# Or (look further here: http://stackoverflow.com/q/1209999/912144)
$ git archive --format=tar --remote=<repository URL> HEAD | tar xf -

Sau khi bạn tạo newrepo, đích để đặt gitrepo1có thể ở bất cứ đâu, ngay cả bên trong newreponếu bạn muốn. Nó không thay đổi quy trình, chỉ là đường dẫn bạn đang viết gitrepo1lại.


6
+1. Có lẽ điều đáng nói là gotcha này ảnh hưởng đến các kho lưu trữ được tạo bằng git phiên bản 1.7.8 hoặc 1.7.9 - có thể có nghĩa là việc di chuyển repo git khiến nó không sử dụng được (mặc dù đã được chỉ ra rằng nó dễ dàng sửa chữa).
AD7six,

1
tôi đang sử dụng máy wndows và sử dụng dấu nhắc lệnh. tôi không thể tìm thấy lệnh "cp". là lệnh "cp" dành riêng cho hệ điều hành khác?
LP13

1
@ user3862378, cpgiống như hầu hết mọi lệnh hoặc chức năng đều dành riêng cho các hệ điều hành khác. Trên thực tế, nó dành riêng cho mọi hệ điều hành không phải là windows. Hãy thử gọi cho microsoft và hỏi họ tại sao không phải là POSIX. Dù sao, cpcó nghĩa là sao chép. mvnghĩa là di chuyển. rmnghĩa là loại bỏ. Bạn có thể tìm thấy các cửa sổ tương đương.
Shahbaz

@Shahbaz. tạo thư mục theo cách thủ công trong windows và di chuyển thư mục ".git" dưới thư mục gốc..có thể hoạt động mà không ảnh hưởng đến lịch sử không?
LP13

2
@ user3862378, không có lý do gì mà không nên. .git/chứa tất cả lịch sử, bao gồm cả cam kết mới nhất của bạn. Bất cứ nơi nào bạn đặt nó, bạn có tất cả lịch sử. Trên thực tế, nếu tất cả các tệp trong thư mục đó khác với kho lưu trữ ban đầu mà bạn đã lấy .git/từ đó, điều duy nhất sẽ là nó cho bạn biết một số tệp đã bị xóa và một số tệp chưa được theo dõi vẫn còn. Với một git reset --hard, các tệp đã xóa sẽ được khôi phục tự động! Chỉ có điều cần lưu ý là chỉ bằng cách sao chép, .git/bạn không thể khôi phục các thay đổi chưa cam kết.
Shahbaz

4

Đã hơi muộn và câu hỏi đã được trả lời nhưng, để làm điều đó mà không phải đau đầu:

  1. Kiểm tra chi nhánh hiện tại mà bạn đang ở trong thư mục git cũ hơn git status, giả sử phát triển chi nhánh
  2. Thay đổi thư mục thành thư mục git mới, sau đó git clonedự án từ repo sang thư mục mới
  3. Kiểm tra chi nhánh hiện tại trong thư mục mới của bạn: git checkout development
  4. Đồng bộ hóa thư mục mới của bạn với thư mục cũ hơn, sử dụng rsync, ngoại trừ thư mục .git :rsync -azv --exclude '.git' gitrepo1 newrepo/gitrepo1

Sau đó, bạn tốt để tiếp tục nơi bạn đã dừng lại


1

Nó thậm chí còn đơn giản hơn thế. Vừa làm điều này (trên Windows, nhưng nó sẽ hoạt động trên hệ điều hành khác):

  1. Tạo newrepo .
  2. Di chuyển gitrepo1 vào newrepo .
  3. Di chuyển .git từ gitrepo1 sang newrepo (tăng một cấp).
  4. Cam kết thay đổi (sửa theo dõi theo yêu cầu).

Git chỉ thấy bạn đã thêm một thư mục và đổi tên một loạt các tệp. Không có vấn đề gì.


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.