Giải pháp chi tiết
Xem ghi chú ở cuối câu trả lời này (đoạn cuối) để biết một giải pháp thay thế nhanh chóng cho mô-đun con git sử dụng npm;)
Trong câu trả lời sau đây, bạn sẽ biết cách trích xuất một thư mục từ một kho lưu trữ và tạo một kho lưu trữ git từ nó và sau đó bao gồm nó như một mô-đun con thay vì một thư mục.
Lấy cảm hứng từ bài viết của Gerg Bayer Di chuyển tệp từ Kho lưu trữ Git này sang Kho lưu trữ Git khác, Lưu giữ lịch sử
Ở phần đầu, chúng ta có một cái gì đó như thế này:
<git repository A>
someFolders
someFiles
someLib <-- we want this to be a new repo and a git submodule!
some files
Trong các bước dưới đây, tôi sẽ gọi điều này someLib
là <directory 1>
.
Cuối cùng, chúng ta sẽ có một cái gì đó như thế này:
<git repository A>
someFolders
someFiles
@submodule --> <git repository B>
<git repository B>
someFolders
someFiles
Tạo một kho lưu trữ git mới từ một thư mục trong một kho lưu trữ khác
Bước 1
Nhận một bản sao mới của kho lưu trữ để chia nhỏ.
git clone <git repository A url>
cd <git repository A directory>
Bước 2
Thư mục hiện tại sẽ là kho lưu trữ mới vì vậy hãy xóa điều khiển từ xa hiện tại.
git remote rm origin
Bước 3
Trích xuất lịch sử của thư mục mong muốn và cam kết nó
git filter-branch --subdirectory-filter <directory 1> -- --all
Bây giờ bạn sẽ có một kho lưu trữ git với các tệp từ directory 1
gốc của kho lưu trữ của bạn với tất cả lịch sử cam kết liên quan.
Bước 4
Tạo kho lưu trữ trực tuyến của bạn và đẩy kho lưu trữ mới của bạn!
git remote add origin <git repository B url>
git push
Bạn có thể cần thiết lập upstream
nhánh cho lần đẩy đầu tiên của mình
git push --set-upstream origin master
Sạch sẽ <git repository A>
(tùy chọn, xem nhận xét)
Chúng tôi muốn xóa dấu vết (tệp và lịch sử cam kết) <git repository B>
khỏi <git repository A>
lịch sử để thư mục này chỉ có một lần.
Điều này dựa trên việc Xóa dữ liệu nhạy cảm khỏi github.
Chuyển đến một thư mục mới và
git clone <git repository A url>
cd <git repository A directory>
git filter-branch --force --index-filter 'git rm --cached --ignore-unmatch <directory 1> -r' --prune-empty --tag-name-filter cat -- --all
Thay thế <directory 1>
bằng thư mục bạn muốn xóa. -r
sẽ làm điều đó một cách đệ quy bên trong thư mục được chỉ định :). Bây giờ đẩy đến origin/master
với--force
git push origin master --force
Giai đoạn Boss (Xem Ghi chú bên dưới)
Tạo một mô-đun con từ <git repository B>
thành<git repository A>
git submodule add <git repository B url>
git submodule update
git commit
Xác minh xem mọi thứ có hoạt động như mong đợi hay không và push
git push origin master
Ghi chú
Sau khi thực hiện tất cả những điều này, tôi nhận ra trong trường hợp của mình rằng thay vào đó, sử dụng npm để quản lý các phần phụ thuộc của riêng tôi sẽ thích hợp hơn . Chúng tôi có thể chỉ định các url git và các phiên bản, hãy xem các url git của package.json là các phần phụ thuộc .
Nếu bạn làm theo cách này, các kho lưu trữ mà bạn muốn sử dụng như là một yêu cầu phải có một mô-đun NPM vì vậy nó phải chứa một package.json
tập tin hoặc bạn sẽ nhận được lỗi này: Error: ENOENT, open 'tmp.tgz-unpack/package.json'
.
tldr (giải pháp thay thế)
Bạn có thể thấy dễ dàng hơn khi sử dụng npm và quản lý các phần phụ thuộc với các url git :
- Di chuyển thư mục đến một kho lưu trữ mới
- chạy
npm init
bên trong cả hai kho
- chạy
npm install --save git://github.com/user/project.git#commit-ish
ở nơi bạn muốn cài đặt các phụ thuộc của mình