Bạn có bỏ qua một mô-đun con git trong .gitignore của mình hay cam kết nó vào repo của bạn không?


94

Tôi đã thêm một mô-đun con vào dự án của mình project_dir/vendor/submodule_onengay bây giờ mỗi khi tôi chạy git statustôi nhận được modified: vendor/submodule_one (new commits).

Câu hỏi của tôi là cách tốt nhất để đối phó với điều này là gì? Tôi có thêm-thư vendor/submodule_onemục vào .gitignorevì dự án chính của tôi nên không cần biết về các chi tiết cụ thể của mô-đun con của tôi không?

Hoặc khi tôi đang thay đổi và xác nhận các thay đổi đối với mô-đun con của mình, tôi cũng cần thực hiện cam kết trong dự án chính của mình?

Chỉ mới bắt đầu với các mô-đun con và dường như không thể tìm thấy nhiều thông tin ngoài việc thiết lập chúng.

Câu trả lời:


80

Không, bạn không cần thêm mô-đun con của mình vào .gitignore: cái mà cha mẹ sẽ thấy từ mô-đun con của bạn là một gitlink (một mục nhập đặc biệt,mode 160000 ).

Điều đó có nghĩa là: bất kỳ thay đổi nào được thực hiện trực tiếp trong một mô-đun con cần phải được theo sau bởi một cam kết trong thư mục mẹ.
Bằng cách đó, thư mục mẹ sẽ ghi lại cam kết phù hợp cho trạng thái của mô-đun con: Cam kết đó là "gitlink" đã đề cập ở trên;

Bạn có thể đọc thêm về chính sách đó trong " git submodule update (bản chất thực sự của submodules) ".
Ý tưởng chính đằng sau các mô-đun con là cách tiếp cận dựa trên thành phần , nơi bạn tham khảo các repo khác ở các cam kết cụ thể. Nhưng nếu bạn thay đổi bất kỳ điều gì trong các mô-đun con đó, bạn cũng cần cập nhật các tham chiếu đó trong repo mẹ.


Lưu ý rằng với Git 2.13 (Quý 2 năm 2017), trong khi không bỏ qua gitlink, bạn vẫn có thể bỏ qua mô-đun con với:

git config submodule.<name>.active false

Xem thêm tại " Bỏ qua cam kết mới cho git submodule ".


Lưu ý: với Git 2.15.x / 2.16 (Q1 2018), việc bỏ qua mô-đun con chính xác hơn.
" git status --ignored --untracked" không dừng lại ở một cây làm việc của một dự án riêng biệt mà được nhúng trong một thư mục bị bỏ qua và các tệp được liệt kê trong dự án khác đó, thay vì chỉ hiển thị bản thân thư mục bị bỏ qua.

Xem cam kết fadb482 (25 tháng 10 năm 2017) của Johannes Schindelin ( dscho) .
(Hợp nhất bởi Junio ​​C Hamano - gitster- in commit da7996a , 06/11/2017)

status: không bị nhầm lẫn bởi các mô-đun con trong các thư mục bị loại trừ

Chúng tôi chuyển excludecờ một cách tỉ mỉ cho treat_directory()hàm để chúng tôi có thể chỉ ra rằng các tệp trong đó bị loại trừ thay vì không được theo dõi khi đệ quy.

Nhưng chúng tôi vẫn chưa xử lý các mô-đun con theo cùng một cách.

Do đó, git status --ignored --untrackedvới một mô-đun con submoduletrong gitignored tracked/sẽ hiển thị mô-đun con trong phần " Untracked files", ví dụ:

On branch master
Untracked files:
  (use "git add <file>..." to include in what will be committed)

    tracked/submodule/

Ignored files:
  (use "git add -f <file>..." to include in what will be committed)

    tracked/submodule/initial.t

Thay vào đó, chúng tôi muốn nó hiển thị mô-đun con trong phần " Ignored files":

On branch master
Ignored files:
  (use "git add -f <file>..." to include in what will be committed)

    tracked/submodule/

1
Cảm ơn VonC, thật hoàn hảo khi bạn đặt nó như vậy.
sprysoft

8
Câu trả lời này gây nhầm lẫn vì tiêu đề Câu hỏi hỏi có nên bỏ qua các thư mục mô-đun con hay không và bạn đang trả lời có cho một câu hỏi riêng biệt sau đó trong phần nội dung câu hỏi.
SgtPooki

1
Tôi nghĩ bây giờ nó có ý nghĩa hơn nhiều và đang cung cấp một số thông tin chuyên sâu rất hữu ích. Tuyệt vời, cảm ơn vì đã cập nhật :)
SgtPooki

Lập luận cho .gitignore: Tại sao đăng ký tệp .gitsubmodules khi url chứa trong đó có thể chứa url git cụ thể của người dùng với thông số tên người dùng?
djangofan

1
@djangofan câu hỏi (và câu trả lời của tôi) là về việc bỏ qua chính thư mục mô-đun con ( thư mục đại diện bởi gitlink). Không phải về việc bỏ qua .gitmodulestệp. Đúng là một tệp này (các .gitmodules) có thể bao gồm thông tin xác thực, nhưng nếu được sử dụng chỉ để sao chép các repo công khai, nó không cần phải bao gồm chúng. Ngoài ra, chúng vẫn có thể được lưu vào bộ nhớ cache, ngay cả trên Windows, với các trình trợ giúp thông tin xác thực như "Trình quản lý thông tin xác thực Git dành cho Windows" ( github.com/Microsoft/Git-Credential-Manager-for-Windows/… ). Vì vậy, có bằng chứng xác thực .gitmoduleskhông phải là một tử vong.
VonC

8

Vì một số lý do submodule.module-name.active không hoạt động với tôi.

Đó là lý do tại sao tôi sử dụng submodule.module-name.ignore

git config submodule.<your module path>.ignore all

https://git-scm.com/docs/gitmodules - tại đây bạn có thể tìm thấy mô tả về các giá trị có thể có cho tham số

Làm việc cho tôi cho (cam kết mới) và (nội dung sửa đổi).


1

Để thêm vào câu trả lời được chấp nhận, tôi nhận thấy rằng việc thêm thư mục Git submodule vào .gitignore thực sự gây ra vấn đề - đặc biệt là khi cố gắng tạo một bản sao mới của dự án. Cụ thể, việc chạy các lệnh sao chép mô-đun con bình thường dẫn đến thư mục mô-đun con trống:

git submodule init
git submodule update
git pull --recurse-submodules

Chỉ bằng cách cố gắng chạy lại

git submodule add <Git repo> <submodule folder>

nó đã rõ ràng vấn đề là gì, dựa trên kết quả:

The following path is ignored by one of your .gitignore files:
<submodule folder>
Use -f if you really want to add it.

Thay vì thêm -f, tôi đã xóa thư mục Git submodule khỏi .gitignore và chạy lại các lệnh clone submodule - hiện đã tạo thành công thư mục. Tôi nghĩ rằng có thể có lỗi trong đó một trong các lệnh sao chép mô-đun con tôn trọng .gitignore nhưng không cảnh báo rằng nó đang bỏ qua một mô-đun con tương ứng.

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.