Nó chỉ ra rằng câu trả lời đơn giản hơn nhiều nếu bạn chỉ đơn giản là cố gắng dán hai kho lưu trữ lại với nhau và làm cho nó trông giống như vậy theo cách đó thay vì quản lý một phụ thuộc bên ngoài. Bạn chỉ cần thêm điều khiển từ xa vào repos cũ của mình, hợp nhất chúng với chủ mới của bạn, di chuyển các tệp và thư mục sang thư mục con, cam kết di chuyển và lặp lại cho tất cả các repos bổ sung. Các mô hình con, sáp nhập cây con và các cuộc nổi loạn ưa thích nhằm giải quyết một vấn đề hơi khác và không phù hợp với những gì tôi đang cố gắng thực hiện.
Dưới đây là một ví dụ về kịch bản Powershell để dán hai kho lưu trữ lại với nhau:
# Assume the current directory is where we want the new repository to be created
# Create the new repository
git init
# Before we do a merge, we have to have an initial commit, so we'll make a dummy commit
git commit --allow-empty -m "Initial dummy commit"
# Add a remote for and fetch the old repo
git remote add -f old_a <OldA repo URL>
# Merge the files from old_a/master into new/master
git merge old_a/master --allow-unrelated-histories
# Move the old_a repo files and folders into a subdirectory so they don't collide with the other repo coming later
mkdir old_a
dir -exclude old_a | %{git mv $_.Name old_a}
# Commit the move
git commit -m "Move old_a files into subdir"
# Do the same thing for old_b
git remote add -f old_b <OldB repo URL>
git merge old_b/master --allow-unrelated-histories
mkdir old_b
dir –exclude old_a,old_b | %{git mv $_.Name old_b}
git commit -m "Move old_b files into subdir"
Rõ ràng thay vào đó, bạn có thể hợp nhất old_b vào old_a (trở thành repo kết hợp mới) nếu bạn muốn làm điều đó - sửa đổi tập lệnh cho phù hợp.
Nếu bạn cũng muốn mang lại các nhánh tính năng đang thực hiện, hãy sử dụng:
# Bring over a feature branch from one of the old repos
git checkout -b feature-in-progress
git merge -s recursive -Xsubtree=old_a old_a/feature-in-progress
Đó là phần không rõ ràng duy nhất của quy trình - đó không phải là hợp nhất cây con, mà là một đối số cho phép hợp nhất đệ quy thông thường cho Git biết rằng chúng tôi đã đổi tên mục tiêu và giúp Git sắp xếp chính xác mọi thứ.
Tôi đã viết lên một lời giải thích chi tiết hơn một chút ở đây .