Làm thế nào để thay đổi một mô-đun con git để trỏ đến một thư mục con?


101

Đọc lướt qua hướng dẫn SubModule , tôi đã tạo một submodule từ dự án boto . Sau đó, tôi phát hiện ra rằng tôi thực sự chỉ cần một tập hợp con của dự án này - cụ thể là thư mục boto .

Tôi muốn thay đổi mô-đun con của mình để trỏ đến thư mục này. Khi tôi nhìn vào .gitmodules, tôi thấy

[submodule "backup/src/boto"]
    path = backup/src/boto
    url = https://github.com/boto/boto.git

Tôi nên sử dụng URL nào thay vì https://github.com/boto/boto.git ? Sau khi thay đổi URL, tôi có nên xóa cục bộ thư mục boto và kéo lại không?


3
Đó không phải là chính xác những gì bạn muốn - không phải là một submodule - nhưng bạn có thể có một cái nhìn tạigit subtree
Cascabel

1
Những gì tôi đã kết thúc là có toàn bộ mô-đun con và nói với IntelliJ rằng thư mục boto là một 'thư mục nguồn', vì vậy nó có thể tìm thấy các gói trong đó.
ripper234

15
Tôi không thể tin rằng git không làm điều này một cách tự nhiên ... đúng.
rogerdpack

2
Tìm thấy một câu hỏi tương tự - stackoverflow.com/questions/1121227/...
sashoalm

Câu trả lời:


65

Tôi e rằng URL cho các mô-đun con luôn chỉ trỏ đến kho lưu trữ - bạn không thể chỉ định rằng bạn chỉ muốn một thư mục con của một kho lưu trữ, giống như cách nói chung git không hỗ trợ "bản sao hẹp".

Nếu bạn không thể sống với toàn bộ kho lưu trữ dưới dạng mô-đun con, bạn luôn có thể tạo một kho lưu trữ mới được sao chép từ boto và sau đó thiết lập một công việc cron để:

  1. git fetch kho lưu trữ đó vào một thư mục
  2. Sử dụng git filter-branchđể cập nhật một nhánh có thư mục con ở cấp cao nhất.
  3. Thêm nhánh đó của kho lưu trữ làm mô-đun con. Tuy nhiên, đó là tất cả một chút rắc rối và sở thích của tôi chỉ là sống với việc có toàn bộ kho lưu trữ như một mô-đun con.

24

Bạn không thể sao chép chỉ một phần của kho lưu trữ. Điều này là do git xử lý kho lưu trữ như một đối tượng toàn bộ: khi bạn lấy nó, bạn sẽ nhận được tất cả .

Vì vậy, giải pháp ở đây sẽ là tìm nạp mô-đun con trong một thư mục khác, sau đó sử dụng liên kết biểu tượng để đạt được mục tiêu của bạn.


Tôi có các liên kết tượng trưng trong windows ... cũng hoạt động tốt. (Đó là vì các msys Tôi đã trên máy tính của tôi, vì vậy tôi có thể sử dụng ln -snhư thế nào trong linux)
kumarharsh

7
Vista và & đi kèm với MKLink. Tôi sử dụng cái đó. howtogeek.com/howto/windows-vista/…
Angel S. Moreno

1
Bạn có thể sử dụng liên kết cứng thay vì
KindDragon

15

Những gì bạn muốn làm là tạo một nhánh trong submodule và di chuyển thư mục lên và xóa những gì bạn không cần. Sau đó, bạn có thể quản lý chi nhánh đó thay thế. Nếu bạn muốn đẩy mạnh các thay đổi của mình, trước tiên bạn có thể hợp nhất lại. Git sẽ biết rằng bạn đã di chuyển các tệp và thực hiện hợp nhất thành công.

Hi vọng điêu nay co ich.


"Back merge" là gì? Bạn có thể cung cấp một ví dụ?
Sukima

hợp nhất đi "ngược dòng" - từ nhánh có bậc cao hơn đến nhánh có bậc thấp hơn. Linus ghét những điều đó. Họ gắn liền với lịch sử từ các chi nhánh khác có thể đã được hợp nhất.
Adam Dymitruk

Bạn có thể vui lòng thêm một số ví dụ về "hợp nhất trở lại" trong tình huống này?
Xiao

Thông thường, đó là khi bạn cố gắng và giữ cho nhánh tính năng của mình hiện tại bằng cách hợp nhất những thứ từ một nhánh chính nơi mọi người đang hợp nhất các thay đổi mới nhất của họ. Điều này thật tệ vì nó ràng buộc chi nhánh của bạn với công việc của người khác. Nếu sản phẩm yêu cầu nhánh của bạn nhưng không phải một trong những cái khác đã có trong nhánh tích hợp, thì không thể.
Adam Dymitruk

ý tưởng thú vị, có ai đã thử điều này? Tôi sẽ cố gắng sớm, nhưng vẫn không chắc chắn rằng "lại hợp nhất" có thể được rõ ràng và tự động ...
moudrick
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.