Tôi muốn hợp nhất một kho lưu trữ git từ xa trong kho lưu trữ git đang làm việc của mình dưới dạng một thư mục con của nó. Tôi muốn kho lưu trữ kết quả chứa lịch sử đã hợp nhất của hai kho lưu trữ và mỗi tệp của kho lưu trữ được hợp nhất sẽ giữ lại lịch sử của nó như trong kho lưu trữ từ xa. Tôi đã thử sử dụng chiến lược cây con như đã đề cập trong Cách sử dụng chiến lược hợp nhất cây con , nhưng sau khi làm theo quy trình đó, mặc dù kho lưu trữ kết quả thực sự chứa lịch sử hợp nhất của hai kho lưu trữ, các tệp riêng lẻ đến từ kho lưu trữ từ xa đã không giữ lại lịch sử của chúng (`git log 'trên bất kỳ mục nào trong số họ chỉ hiển thị thông báo" Chi nhánh đã hợp nhất ... ").
Ngoài ra, tôi không muốn sử dụng mô-đun con vì tôi không muốn hai kho lưu trữ git kết hợp riêng biệt nữa.
Có thể hợp nhất một kho lưu trữ git từ xa vào một kho lưu trữ khác dưới dạng một thư mục con với các tệp riêng lẻ đến từ kho lưu trữ từ xa có lưu giữ lịch sử của chúng không?
Cảm ơn rất nhiều sự giúp đỡ nào.
CHỈNH SỬA: Tôi hiện đang thử một giải pháp sử dụng git filter-branch để viết lại lịch sử kho lưu trữ đã hợp nhất. Nó dường như hoạt động, nhưng tôi cần phải kiểm tra nó một số nữa. Tôi sẽ trở lại để báo cáo về những phát hiện của tôi.
CHỈNH SỬA 2: Với hy vọng làm cho bản thân rõ ràng hơn, tôi đưa ra các lệnh chính xác mà tôi đã sử dụng với chiến lược cây con của git, dẫn đến mất lịch sử rõ ràng của các tệp của kho lưu trữ từ xa. Đặt A là git repo mà tôi hiện đang làm việc và B là git repo mà tôi muốn kết hợp vào A như một thư mục con của nó. Nó đã làm như sau:
git remote add -f B <url-of-B>
git merge -s ours --no-commit B/master
git read-tree --prefix=subdir/Iwant/to/put/B/in/ -u B/master
git commit -m "Merge B as subdirectory in subdir/Iwant/to/put/B/in."
Sau các lệnh này và đi vào thư mục subir / Iwant / to / put / B / in, tôi thấy tất cả các tệp của B, nhưng git log
trên bất kỳ tệp nào trong số đó chỉ hiển thị thông báo cam kết "Hợp nhất B làm thư mục con trong subir / Iwant / to / put /Thùng rác." Lịch sử tệp của họ như ở B đã bị mất.
Những gì có vẻ hoạt động (vì tôi là người mới bắt đầu sử dụng git, tôi có thể sai) là những điều sau:
git remote add -f B <url-of-B>
git checkout -b B_branch B/master # make a local branch following B's master
git filter-branch --index-filter \
'git ls-files -s | sed "s-\t\"*-&subdir/Iwant/to/put/B/in/-" |
GIT_INDEX_FILE=$GIT_INDEX_FILE.new \
git update-index --index-info &&
mv "$GIT_INDEX_FILE.new" "$GIT_INDEX_FILE"' HEAD
git checkout master
git merge B_branch
Lệnh trên cho nhánh bộ lọc được lấy từ git help filter-branch
, trong đó tôi chỉ thay đổi đường dẫn phụ.
gitk
về lịch sử? Tôi đã sử dụng hợp nhất cây con git thành công trong quá khứ. Có lẽ bạn có thể tiết lộ các lệnh chính xác của bạn? Tôi không chắc git-filter-branch là cách tiếp cận phù hợp. Tôi có thể khuyên bạn nên thử git-fast-export và git-fast-import để tổng hợp lịch sử mới.