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 --mirrorgit 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é!

Tagged in:

, ,