Cách di chuyển kho GIT từ một máy chủ sang một máy chủ mới


264

Tôi có một máy chủ mà tôi đang gỡ xuống. Điều duy nhất tôi còn lại để di chuyển là kho lưu trữ của tôi. Máy chủ này được liệt kê là nguồn gốc (chính) cho một trong các dự án của tôi. Cách thích hợp để di chuyển kho lưu trữ để giữ lịch sử.


Tất cả thông tin (quỹ đạo, trung kế, v.v.) về kho lưu trữ được lưu trữ trong thư mục có tên '.git', nơi bạn đang khởi tạo kho lưu trữ. Vì vậy, bạn cần sao chép nội dung vào máy chủ mới, sử dụng các hướng dẫn được cung cấp tại đây
Mansab Uppal

1
chỉ đơn giản là git config remote.origin.url newurl xem stackoverflow.com/questions/3011402/
Niels

1
Nếu bạn muốn di chuyển repo của bạn và tất cả các chi nhánh sử dụng câu trả lời của jzwiener hoặc Roberto hơn là câu trả lời được chấp nhận.
jonaglon

Câu trả lời:


247

Để thêm vị trí repo mới,

git remote add new_repo_name new_repo_url

Sau đó đẩy nội dung đến vị trí mới

git push new_repo_name master

Cuối cùng loại bỏ cái cũ

git remote rm origin

Sau đó, bạn có thể thực hiện những gì bdonlan đã nói và chỉnh sửa tệp.git / config để thay đổi new_Vpo_name thành nguồn gốc. Nếu bạn không xóa nguồn gốc (kho lưu trữ từ xa gốc), bạn chỉ cần đẩy các thay đổi sang repo mới bằng

git push new_repo_name master

8
Điều này sẽ chỉ sao chép một nhánh duy nhất từ ​​kho lưu trữ cũ sang kho mới?
Andrew Grimm

34
Giải pháp để di chuyển tất cả các chi nhánh là gì?
emmby

50
Bạn sẽ có thể đẩy tất cả các chi nhánh cùng một lúc thông qua git push -u new_repo_name --all.
rmarscher

10
Di chuyển của tất cả các chi nhánh có thể được tìm thấy tại stackoverflow.com/a/18336145/923599
jzwiener

10
Thay vì chỉnh sửa tệp git-config, lệnh này hoạt động với tôi:git remote rename new_repo_name origin
Salim

210

Nếu bạn muốn di chuyển tất cả các nhánh và thẻ, bạn nên sử dụng các lệnh sau:

git clone --mirror [oldUrl]

nhân bản repo cũ với tất cả các chi nhánh

cd the_repo
git remote add remoteName newRepoUrl

để thiết lập một điều khiển từ xa mới

git push -f --tags remoteName refs/heads/*:refs/heads/*

để đẩy tất cả các ref dưới refs / Heads (có lẽ là những gì bạn muốn)


5
Git đã phàn nàn rằng --tagsrefs/heads/*:refs/heads/*không tương thích với --mirror. stackoverflow.com/a/26552740/1484831 hoạt động tốt.
Avigit

3
Tôi đã sử dụng nó và nó làm việc cho tôi. Có lẽ nên là câu trả lời được bầu. Lưu ý rằng "mã" bạn nhận được cục bộ dường như nặng về dữ liệu meta khiến cho người mới không rõ ràng nếu có sự cố.
nick

3
Đây phải là câu trả lời được phê duyệt. Tốt hơn nhiều so với các giải pháp khác
Travis Griggs

15
Tôi đã kết thúc với tất cả các nhánh trên kho lưu trữ từ xa mới có tiền tố refs/heads/refs/headsbằng cách sử dụng git push -f --tags remoteName refs/heads/*:refs/heads/*vì vậy tôi đã đổi sanggit push remoteName --mirror
dumbledad

1
pushcũng hỗ trợ --mirror. git clone --mirror; cd repo; git push --mirror new_remotenên thực hiện các mẹo
knittl

144

Điều này làm việc cho tôi hoàn hảo .

git clone --mirror <URL to my OLD repo location>
cd <New directory where your OLD repo was cloned>
git remote set-url origin <URL to my NEW repo location>
git push -f origin

Tôi phải đề cập đến mặc dù điều này tạo ra một tấm gương của repo hiện tại của bạn và sau đó đẩy nó đến vị trí mới. Do đó, điều này có thể mất một thời gian cho các repos lớn hoặc kết nối chậm .


15
*** Cái này ***
Paul Lockwood

1
Đây là giải pháp tốt git nguồn gốc set-url từ xa <URL đến vị trí repo MỚI của tôi> (sau khi đã đồng bộ hóa nguồn gốc cũ với máy chủ / vị trí mới)
Toni Homedes i Saun

2
Điều này một chảo tuyệt vời. Không có nhiều điều khiển từ xa khó hiểu
TaoPR

17
Thích git push --mirror originhơn -f.
Aidiakapi

78

Sao chép nó qua. Nó thực sự đơn giản. :)

Về phía khách hàng, chỉ cần chỉnh sửa .git / config trong repo cục bộ của máy khách để trỏ từ xa của bạn tới URL mới khi cần thiết.


6
Bạn cũng có thể đơn giản nhân bản nó. Ngoài ra, thay vì trực tiếp chỉnh sửa tệp .git / config, bạn có thể sử dụng git remote rm origin; git từ xa thêm nguồn gốc <kho lưu trữ mới>.
ebneter

4
Việc điều khiển từ xa sẽ làm mất bất kỳ cấu hình nào trong phần cấu hình đó - và nhân bản nó mà không thực hiện bất kỳ bước bổ sung nào sẽ làm mất các nhánh khác ngoài thân cây. Có thể giải quyết những vấn đề này, nhưng, thực sự - chỉ cần đồng bộ hóa nó.
bdonlan

1
Giải pháp chỉ sử dụng git để thực hiện công việc là gì? rsync yêu cầu các vòng quản trị bổ sung khó nhảy qua
emmby

2
cái này cũng bảo tồn ví dụ như hook và cấu hình khác, vì vậy tôi thích nó hơn các giải pháp git thuần túy
mnagel

65

Đây là loại được thực hiện trong các phần trong một số câu trả lời khác.

git clone --mirror git@oldserver:oldproject.git
cd oldproject.git
git remote add new git@newserver:newproject.git
git push --mirror new

6
Trên thực tế, đây là câu trả lời đầy đủ nhất, thẳng thắn nhất.
Lawrence Dol

3
--mirrortrong việc thúc đẩy là rất quan trọng: đây phải là câu trả lời chính xác
PaoloC

Khi bạn khởi tạo kho lưu trữ mới trên máy chủ mới, hãy nhớ thực hiện một init đơn giản hoặc việc đẩy sẽ không thành công:git init --bare
marco

35

Tôi chỉ đăng lại những gì người khác đã nói, trong một danh sách đơn giản để làm theo danh sách hướng dẫn.

  1. Di chuyển kho lưu trữ: Chỉ cần đăng nhập vào máy chủ mới, cdvào thư mục mẹ nơi bạn muốn giữ kho lưu trữ và sử dụng rsyncđể sao chép từ máy chủ cũ:

    new.server> rsync -a -v -e ssh user@old.server.com:path/to/repository.git .
    
  2. Làm cho máy khách trỏ đến kho lưu trữ mới: Bây giờ trên mỗi máy khách sử dụng kho lưu trữ, chỉ cần xóa con trỏ về nguồn gốc cũ và thêm một con trỏ vào kho lưu trữ mới.

    client> git remote rm origin
    client> git remote add origin user@new.server.com:path/to/repository.git
    

Đơn giản và hiệu quả. Bạn có thể thêm cờ --bwlimit = XXX nếu bạn muốn giới hạn lưu lượng giữa các máy chủ, trong đó XXX bằng băng thông tính bằng KByte mỗi giây.
Greg Glockner

7
Bit tốt hơn so với loại bỏ và thêm:git remote set-url origin user@new.server.com:path/to/repository.git
Chris KL

Đối với những người triển khai đến máy chủ bằng git + capistrano, lưu ý rằng tôi phải sử dụng nguồn gốc set-url ở 2 vị trí: trên localhost và trên bản sao được lưu trong bộ nhớ cache trên máy chủ.
anandvc


10

Tôi đã làm theo hướng dẫn trên BitBucket để di chuyển một repo với tất cả các chi nhánh của nó ở đó. Đây là các bước với lời giải thích sau #nhân vật:

cd path/to/local/repo
git remote remove origin # to get rid of the old setting, this was not in the BitBucket instructions
git remote add origin ssh://git@bitbucket.org/<username>/<newrepo> # modify URL as needed
git push -u origin --all # pushes _ALL_ branches in one go
git push -u origin --tags # pushes _ALL_ tags in one go

Làm việc độc đáo cho tôi.


8

Vui lòng làm theo các bước:

  • git từ xa thêm nguồn gốc mới
  • git đẩy - tất cả các nguồn gốc mới
  • git đẩy --tags nguồn gốc mới
  • nguồn gốc git từ xa
  • git từ xa đổi tên nguồn gốc mới

5

Đây là một biến thể của câu trả lời này , hiện được gitlab đề xuất để "di chuyển" một kho lưu trữ git từ máy chủ này sang máy chủ khác.

  1. Hãy để chúng tôi giả định rằng dự án cũ của bạn được gọi existing_repo, được lưu trữ trong một existing_repothư mục.

  2. Tạo một repo trên máy chủ mới của bạn. Chúng tôi sẽ cho rằng url của dự án mới đó làgit@newserver:newproject.git

  3. Mở giao diện dòng lệnh và nhập thông tin sau:

    cd existing_repo
    git remote rename origin old-origin
    git remote add origin git@newserver:newproject.git
    git push -u origin --all
    git push -u origin --tags
    

Lợi ích của phương pháp này là bạn không xóa chi nhánh tương ứng với máy chủ cũ của mình.


4

Bạn có thể sử dụng lệnh sau:

git remote set-url --push origin new_repo_url

Ví dụ từ http://gitref.org/remotes/

$ git remote -v
github  git@github.com:schacon/hw.git (fetch)
github  git@github.com:schacon/hw.git (push)
origin  git://github.com/github/git-reference.git (fetch)
origin  git://github.com/github/git-reference.git (push)
$ git remote set-url --push origin git://github.com/pjhyett/hw.git
$ git remote -v
github  git@github.com:schacon/hw.git (fetch)
github  git@github.com:schacon/hw.git (push)
origin  git://github.com/github/git-reference.git (fetch)
origin  git://github.com/pjhyett/hw.git (push)

4

Nên đơn giản như:

git remote set-url origin git://new.url.here

Bằng cách này, bạn giữ tên origincho repo mới của mình - sau đó đẩy sang repo mới như repo cũ như chi tiết trong các câu trả lời khác. Giả sử bạn làm việc một mình và bạn có một repo cục bộ mà bạn muốn phản chiếu với tất cả hành trình của bạn trong đó, bạn cũng có thể (từ bên trong repo địa phương của bạn)

git push origin --mirror # origin points to your new repo

nhưng xem "git đẩy --mirror" có đủ để sao lưu kho lưu trữ của tôi không? (trong tất cả không sử dụng --mirrornhưng một lần).


3

làm theo các hướng dẫn sau Nếu bạn muốn giữ tất cả các cam kết và các nhánh từ repo cũ đến mới

git clone --bare <old-repo-url>
cd <old-repo-directory>
git push --mirror <new-repo-url>

1

Bạn có thể sử dụng git-copy để sao chép repo với tất cả lịch sử.

git copy http://a.com/old.git http://a.com/new.git

1

Nếu bạn muốn chuyển từ nguồn gốc này sang nguồn gốc khác và cũng giữ một bản sao lưu nguồn gốc hiện tại của mình trên máy cục bộ, bạn có thể sử dụng các bước sau:

  1. Đầu tiên, vào thư mục (git) mà bạn muốn di chuyển qua
  2. Tạo kho lưu trữ mới trực tuyến Bước này tạo một kho lưu trữ nơi chúng ta có thể đẩy mã đến

Bây giờ trong thư mục làm

git remote get-url origin

Lệnh trên cung cấp url nguồn gốc từ xa hiện tại, hữu ích để đặt lại nguồn gốc ở bước cuối cùng

git remote set-url origin git@github.newlocation:folder/newrepo.git

Lệnh trên đặt nguồn gốc từ xa đến vị trí mới

git push --set-upstream origin develop

Lệnh trên đẩy nhánh cục bộ đang hoạt động hiện tại lên từ xa với tên nhánh phát triển. Tất nhiên nó bảo tồn tất cả lịch sử như với git, tất cả lịch sử cũng được đẩy mạnh.

git remote set-url origin <original old origin>

Lệnh trên đặt lại nguồn gốc từ xa về nguồn gốc hiện tại của bạn: bạn muốn điều này bởi vì bạn đang ở trong thư mục hiện tại của bạn và bạn có thể không muốn trộn lẫn tên thư mục cục bộ hiện tại của mình với thư mục mới mà bạn sẽ tạo để sao chép repo bạn chỉ cần đẩy đến.

Hi vọng điêu nay co ich,


0

Nếu bạn muốn di chuyển kho lưu trữ #git từ một máy chủ sang máy chủ mới, bạn có thể làm như thế này:

git clone OLD_REPOSITORY_PATH
cd OLD_REPOSITORY_DIR
git remote add NEW_REPOSITORY_ALIAS  NEW_REPOSITORY_PATH
#check out all remote branches 
for remote in `git branch -r | grep -v master `; do git checkout --track $remote ; done
git push --mirror NEW_REPOSITORY_PATH
git push NEW_REPOSITORY_ALIAS --tags

Tất cả các nhánh và thẻ từ xa từ kho lưu trữ cũ sẽ được sao chép vào kho lưu trữ mới.

Chạy lệnh này một mình:

git push NEW_REPOSITORY_ALIAS

sẽ chỉ sao chép một nhánh chính (chỉ theo dõi các nhánh) vào kho lưu trữ mới.

Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.