Khi dùng Git, đôi khi chúng ta cần di chuyển repository từ nền tảng này sang nền tảng khác — chẳng hạn từ GitHub sang GitLab, Bitbucket hoặc thậm chí sang một server riêng chạy Gitea. Lý do thì nhiều, có thể do thay đổi chính sách nội bộ, muốn dùng CI/CD tốt hơn, hoặc đơn giản là muốn gom repo về một chỗ cho gọn.
Mình cũng từng chuyển repo qua lại giữa GitHub và Gitea – lúc đầu muốn dùng server riêng cho chủ động, sau thấy không ổn lại quay về GitHub 😀. Vì vậy mình viết bài này, ví dụ sẽ lấy GitHub và Gitea, còn các dịch vụ khác thì cũng làm tương tự thôi.
1. Clone repository dạng mirror
Nếu bạn từng dùng git clone
, có thể sẽ quen với việc chỉ lấy branch chính (thường là main
hoặc master
). Tuy nhiên, nếu muốn giữ toàn bộ lịch sử, bao gồm tất cả các nhánh, tag và refs, thì nên dùng --mirror
. Mirror khác với clone thông thường ở chỗ nó sao chép toàn bộ các nhánh, tags, và tất cả các tham chiếu (refs).
Ví dụ (clone repo dạng –mirror từ GitHub):
git clone --mirror https://github.com/phanxuanchanh/ten-repo.git
Lệnh trên sẽ tạo ra một thư mục ten-repo.git
chứa toàn bộ nội dung repository ở định dạng “bare”, bao gồm cả cấu hình remote và thông tin quản lý phiên bản đầy đủ.
2. Tạo repository trống trên dịch vụ mới
Tùy vào lựa chọn của bạn, có thể là GitLab, Bitbucket, Gitea hoặc bất kỳ dịch vụ nào khác. Tạo một repository mới ở đó, lưu ý không khởi tạo với bất kỳ nội dung nào (README, .gitignore, LICENSE…) để tránh xung đột khi push dữ liệu.
Ví dụ (tạo một repo mới trên Gitea):
https://gitea.omnisci-lab.com/phanxuanchanh/ten-repo.git
3. Push mirror lên repository mới
Sau khi clone mirror, bạn chuyển vào thư mục đó và push sang repository mới:
cd ten-repo.git
git push --mirror https://gitea.omnisci-lab.com/phanxuanchanh/ten-repo.git
Lệnh này sẽ sao chép toàn bộ nội dung của repository gốc (bao gồm tất cả các nhánh và tags) sang repository mới, đảm bảo tính toàn vẹn của lịch sử commit.
4. Cập nhật remote cho repo local (tuỳ chọn)
Nếu bạn đã có repo local và muốn chuyển sang remote mới, hãy cập nhật lại URL remote:
cd /duongdan/to/local-repo
git remote set-url origin https://gitea.omnisci-lab.com/phanxuanchanh/ten-repo.git
5. Kiểm tra kết quả
Sau khi push hoàn tất, truy cập repository mới để xác minh rằng tất cả các nhánh và tags đã được chuyển thành công. Có thể dùng lệnh dưới đây:
git ls-remote https://gitea.omnisci-lab.com/phanxuanchanh/ten-repo.git
6. Ghi chú
git clone --mirror
vàgit push --mirror
là phương thức được khuyến nghị khi cần sao chép toàn bộ repository, bao gồm cả các nhánh phụ và dữ liệu metadata.- Nếu chỉ cần chuyển nhánh chính, có thể sử dụng
git clone
thông thường và push thủ công từng nhánh hoặc tag cần thiết. - Với những repository lớn, quá trình push có thể hơi lâu và đôi khi gặp giới hạn từ nền tảng đích (như timeout hay dung lượng), nên cứ kiểm tra trước và kiên nhẫn một chút là ổn.
7. Lời kết
Trên đây là hướng dẫn giúp bạn chuyển repository sang nền tảng khác một cách đầy đủ và gọn gàng. Chỉ với --mirror
, việc di chuyển trở nên đơn giản hơn bao giờ hết.
Cảm ơn bạn đã đọc! Nếu thấy bài viết hữu ích, hãy chia sẻ để nhiều người cùng biết nhé!