Đây là một giải pháp tôi đã đưa ra ở đây :
Trước tiên hãy sao lưu toàn bộ thư mục phd của bạn: Tôi không muốn chịu trách nhiệm cho những năm tháng vất vả của bạn! ;-)
$ cp -r phd phd-backup
Di chuyển nội dung phd/code
đến phd/code/code
và sửa lịch sử sao cho có vẻ như nó vẫn luôn ở đó (thao tác này sử dụng lệnh bộ lọc nhánh của git ):
$ cd phd/code
$ git filter-branch --index-filter \
'git ls-files -s | sed "s#\t#&code/#" |
GIT_INDEX_FILE=$GIT_INDEX_FILE.new \
git update-index --index-info &&
mv $GIT_INDEX_FILE.new $GIT_INDEX_FILE' HEAD
Tương tự cho nội dung của phd/figures
và phd/thesis
(chỉ cần thay thế code
bằng figures
và thesis
).
Bây giờ cấu trúc thư mục của bạn sẽ trông như thế này:
phd
|_code
| |_.git
| |_code
| |_(your code...)
|_figures
| |_.git
| |_figures
| |_(your figures...)
|_thesis
|_.git
|_thesis
|_(your thesis...)
Sau đó tạo một kho lưu trữ git trong thư mục gốc, kéo mọi thứ vào đó và xóa các kho lưu trữ cũ:
$ cd phd
$ git init
$ git pull code
$ rm -rf code/code
$ rm -rf code/.git
$ git pull figures --allow-unrelated-histories
$ rm -rf figures/figures
$ rm -rf figures/.git
$ git pull thesis --allow-unrelated-histories
$ rm -rf thesis/thesis
$ rm -rf thesis/.git
Cuối cùng, bây giờ bạn sẽ có những gì bạn muốn:
phd
|_.git
|_code
| |_(your code...)
|_figures
| |_(your figures...)
|_thesis
|_(your thesis...)
Một khía cạnh tốt đẹp của thủ tục này là nó sẽ để lại các tệp và thư mục không được phiên bản .
Hi vọng điêu nay co ich.
Chỉ cần một từ cảnh báo: nếu code
thư mục của bạn đã có code
thư mục con hoặc tệp, mọi thứ có thể rất sai (tương tự figures
và thesis
tất nhiên). Nếu đúng như vậy, chỉ cần đổi tên thư mục hoặc tệp đó trước khi thực hiện toàn bộ quy trình này:
$ cd phd/code
$ git mv code code-repository-migration
$ git commit -m "preparing the code directory for migration"
Và khi thủ tục kết thúc, hãy thêm bước cuối cùng này:
$ cd phd
$ git mv code/code-repository-migration code/code
$ git commit -m "final step for code directory migration"
Tất nhiên, nếu code
thư mục con hoặc tệp không được phiên bản, chỉ cần sử dụng mv
thay vì git mv
và quên đi git commit
s.