2013-01-21 28 views
9

Tôi muốn di chuyển kho lưu trữ git từ xa và tất cả các nhánh của nó sang một kho lưu trữ từ xa mới.Làm cách nào để chuyển repo git từ xa của tôi sang một repo git từ xa khác?

cũ từ xa = [email protected]:thunderrabbit/thunderrabbit.github.com.git

mới từ xa = [email protected]:tr/tr.newrepo.git

+0

Tôi biết rằng đây là câu hỏi tự trả lời, nhưng bản thân câu hỏi vẫn có chất lượng rất thấp. Có thể thử thêm một số ý tưởng mà bạn đã thử hoặc tài liệu mà bạn đã xem trước khi đưa ra câu trả lời (http://stackoverflow.com/a/14432237/456814). –

+0

FYI, [câu trả lời của umläute] (http://stackoverflow.com/a/14435630/456814) không hoàn toàn chính xác, hãy xem [bình luận của tôi] (http://stackoverflow.com/questions/14432234/how-do- i-move-my-remote-git-repo-to-khác-remote-git-repo # comment35718703_14435630). –

Trả lời

5

Vì vậy, những câu trả lời nào khác không giải thích rõ ràng là nếu bạn muốn di chuyển tất cả các kho lưu trữ từ xa của bạn anches đến một điều khiển từ xa mới bằng cách sử dụng cơ chế push của Git, sau đó bạn cần phiên bản chi nhánh địa phương của từng chi nhánh từ xa của bạn.

Bạn có thể sử dụng git branch để tạo các chi nhánh địa phương. Điều đó sẽ tạo ra một tài liệu tham khảo chi nhánh dưới thư mục .git/refs/heads/ của bạn, nơi tất cả các tài liệu tham khảo chi nhánh tại địa phương của bạn được lưu giữ.

Sau đó, bạn có thể sử dụng git push với --all--tags cờ tùy chọn:

git push <new-remote> --all # Push all branches under .git/refs/heads 
git push <new-remote> --tags # Push all tags under .git/refs/tags 

Lưu ý rằng --all--tags không thể được sử dụng với nhau, vì vậy đó là lý do tại sao bạn phải đẩy hai lần.

Documentation

Đây là liên quan git push documentation:

--all 

Thay vì đặt tên mỗi ref để đẩy, quy định rằng tất cả các refs dưới refs/heads/ được đẩy.

--tags 

Tất cả refs dưới refs/tags được đẩy, ngoài refspecs rõ ràng liệt kê trên dòng lệnh.

--mirror

Cũng lưu ý rằng --mirror có thể được sử dụng để đẩy cả hai chi nhánh và thẻ tham khảo tại một lần, nhưng vấn đề với cờ này là nó đẩy tất cả các tài liệu tham khảo trong .git/refs/, không chỉ .git/refs/heads.git/refs/tags, có thể không phải là những gì bạn muốn đẩy tới điều khiển từ xa của mình.

Ví dụ, --mirror có thể đẩy chi nhánh theo dõi từ xa của bạn từ cũ từ xa (s) đang được .git/refs/remotes/<remote>/, cũng như tài liệu tham khảo khác của bạn như .git/refs/original/, mà là một sản phẩm phụ của git filter-branch.

9

Trong terminal trên máy tính địa phương của bạn:

cd ~ 
git clone <old-remote> unique_local_name 
cd unique_local_name 

for remote in `git branch -r | grep -v master `; \ 
do git checkout --track $remote ; done 

git remote add neworigin <new-remote> 
git push --all neworigin 
+0

Dòng cuối cùng (git push --all gitlab) là lỗi đánh máy? Nó không phải là nguồn gốc mới, không phải gitlab? –

+0

À vâng, có vẻ như vậy. Cảm ơn bạn! –

+1

FYI, nếu bạn muốn đẩy thẻ, thì bạn cũng cần sử dụng 'git push --tags' (nó không thể được sử dụng cùng lúc với' --all'). Ngoài ra, thay vì sử dụng 'git checkout', bạn cũng có thể sử dụng' git branch', có thể sẽ nhanh hơn, vì bạn không chuyển đổi tệp trong bản sao làm việc của mình. –

3

Tổng số các ý tưởng là để cho mỗi chi nhánh từ xa cũ làm:

  • checkout
  • kéo
  • push to điều khiển từ xa mới (đừng quên về các thẻ!)

Giống như rằng:

#!/bin/bash 

[email protected]:tr/tr.newrepo.git 
new_remote=new_remote 
[email protected]:thunderrabbit/thunderrabbit.github.com.git 
old_remote=origin 

git remote add ${old_remote} ${old_remote_link} 

git pull ${old_remote} 

BRANCHES=`git ls-remote --heads ${old_remote} | sed 's?.*refs/heads/??'` 

git remote add ${new_remote} ${new_remote_link} 

for branch in ${BRANCHES}; do 
    git checkout ${branch} 
    git pull ${old_remote} ${branch} 
    git push ${new_remote} ${branch} --tags 
    printf "\nlatest %s commit\n" ${branch} 
    git log --pretty=format:"(%cr) %h: %s%n%n" -n1 
done 
0

Bạn chỉ có thể thay đổi URL cho kho origin của bạn:

git clone <old-remote-url> unique_local_name 
cd unique_local_name 
git pull --all 

git remote set-url origin <new-remote-url> 
git push --all 
+0

Đây không phải là khá chính xác, nếu bạn không có phiên bản chi nhánh địa phương của mỗi chi nhánh từ xa của bạn, sau đó họ sẽ không được đẩy đến điều khiển từ xa mới. Chỉ các nhánh địa phương dưới '.git/refs/heads /' sẽ bị đẩy. –