Bạn đã thêm vendor/plugins/open_flash_chart_2
mục nhập của gitlink, nhưng không bao giờ định nghĩa nó là một mô hình con. Thực tế, bạn đang sử dụng tính năng bên trong mà git mô đun con sử dụng (các mục gitlink) nhưng bạn không sử dụng chính tính năng mô hình con.
Bạn có thể đã làm một cái gì đó như thế này:
git clone git://github.com/korin/open_flash_chart_2_plugin.git vendor/plugins/open_flash_chart_2
git add vendor/plugins/open_flash_chart_2
Lệnh cuối cùng này là vấn đề. Thư mục vendor/plugins/open_flash_chart_2
bắt đầu như một kho lưu trữ Git độc lập. Thông thường các kho lưu trữ phụ như vậy bị bỏ qua, nhưng nếu bạn nói với git add để thêm nó một cách rõ ràng, thì nó sẽ tạo ra một mục gitlink trỏ đến cam kết HEAD của kho lưu trữ phụ thay vì thêm nội dung của thư mục. Sẽ thật tuyệt nếu git add sẽ từ chối tạo ra những mô hình con nửa mô đun đó.
Các thư mục bình thường được biểu diễn dưới dạng các đối tượng cây trong Git; các đối tượng cây cung cấp tên và quyền cho các đối tượng mà chúng chứa (thường là các đối tượng cây và blob khác tương ứng với các thư mục và tệp). Các mô hình con được thể hiện dưới dạng các mục nhập của gitlink các mục gitlink chỉ chứa tên đối tượng (hàm băm) của cam kết CHÍNH của mô hình con. Kho lưu trữ nguồn của NỮA cho một cam kết của gitlink được chỉ định trong .gitmodules
tệp (và .git/config
tệp sau khi mô hình con đã được khởi tạo).
Những gì bạn có là một mục trỏ đến một cam kết cụ thể, mà không ghi lại kho lưu trữ nguồn cho cam kết đó. Bạn có thể khắc phục điều này bằng cách biến gitlink của bạn thành một mô hình con phù hợp hoặc bằng cách loại bỏ gitlink và thay thế nó bằng nội dung bình thường của Wap (các tệp và thư mục đơn giản).
Biến nó thành một mô hình con đúng
Bit duy nhất bạn đang thiếu để xác định đúng vendor/plugins/open_flash_chart_2
là một mô hình con là một .gitmodules
tệp. Thông thường (nếu bạn chưa thêm nó dưới dạng mục nhập gitlink trần), bạn sẽ chỉ sử dụng git submodule add
:
git submodule add git://github.com/korin/open_flash_chart_2_plugin.git vendor/plugins/open_flash_chart_2
Như bạn đã tìm thấy, điều này sẽ không hoạt động nếu đường dẫn đã tồn tại trong chỉ mục. Giải pháp là tạm thời xóa mục gitlink khỏi chỉ mục và sau đó thêm mô hình con:
git rm --cached vendor/plugins/open_flash_chart_2
git submodule add git://github.com/korin/open_flash_chart_2_plugin.git vendor/plugins/open_flash_chart_2
Điều này sẽ sử dụng kho lưu trữ phụ hiện có của bạn (tức là nó sẽ không sao chép lại kho lưu trữ nguồn) và tạo một .gitmodules
tệp trông như thế này:
[submodule "vendor/plugins/open_flash_chart_2"]
path = vendor/plugins/open_flash_chart_2
url = git://github.com/korin/open_flash_chart_2_plugin.git vendor/plugins/open_flash_chart_2
Nó cũng sẽ tạo một mục tương tự trong kho lưu trữ chính của bạn .git/config
(không có path
cài đặt).
Cam kết rằng và bạn sẽ có một mô hình con thích hợp. Khi bạn sao chép kho lưu trữ (hoặc đẩy vào GitHub và sao chép từ đó), bạn sẽ có thể khởi tạo lại mô hình con thông qua git submodule update --init
.
Thay thế nó bằng nội dung đơn giản
Bước tiếp theo giả định rằng kho lưu trữ phụ của bạn vendor/plugins/open_flash_chart_2
không có bất kỳ lịch sử cục bộ nào bạn muốn lưu giữ (tức là tất cả những gì bạn quan tâm là cây làm việc hiện tại của kho lưu trữ phụ, không phải lịch sử).
Nếu bạn có lịch sử cục bộ trong kho lưu trữ phụ mà bạn quan tâm, thì bạn nên sao lưu .git
thư mục của kho lưu trữ phụ trước khi xóa nó trong lệnh thứ hai bên dưới. (Cũng xem xét ví dụ về cây con git dưới đây để lưu giữ lịch sử của ĐẦU của kho lưu trữ phụ).
git rm --cached vendor/plugins/open_flash_chart_2
rm -rf vendor/plugins/open_flash_chart_2/.git # BACK THIS UP FIRST unless you are sure you have no local changes in it
git add vendor/plugins/open_flash_chart_2
Lần này khi thêm thư mục, nó không phải là kho lưu trữ phụ, vì vậy các tệp sẽ được thêm bình thường. Thật không may, vì chúng tôi đã xóa .git
thư mục, không có cách nào siêu dễ dàng để giữ mọi thứ cập nhật với kho lưu trữ nguồn.
Bạn có thể xem xét sử dụng hợp nhất cây con thay thế. Làm như vậy sẽ cho phép bạn dễ dàng lấy ra các thay đổi từ kho lưu trữ nguồn trong khi vẫn giữ các tệp trong mạng phẳng phẳng trong kho lưu trữ của bạn (không có mô hình con). Các bên thứ ba git subtree lệnh là một wrapper đẹp xung quanh các chức năng cây con hợp nhất.
git rm --cached vendor/plugins/open_flash_chart_2
git commit -m'converting to subtree; please stand by'
mv vendor/plugins/open_flash_chart_2 ../ofc2.local
git subtree add --prefix=vendor/plugins/open_flash_chart_2 ../ofc2.local HEAD
#rm -rf ../ofc2.local # if HEAD was the only tip with local history
Một lát sau:
git remote add ofc2 git://github.com/korin/open_flash_chart_2_plugin.git
git subtree pull --prefix=vendor/plugins/open_flash_chart_2 ofc2 master
git subtree push --prefix=vendor/plugins/open_flash_chart_2 git@github.com:me/my_ofc2_fork.git changes_for_pull_request
git Subree cũng có một --squash
tùy chọn cho phép bạn tránh kết hợp lịch sử của kho lưu trữ nguồn vào lịch sử của mình nhưng vẫn cho phép bạn thay đổi ngược dòng.