Di chuyển nội dung kho lưu trữ Git sang kho lưu trữ lịch sử khác


141

Tôi đang cố gắng chỉ di chuyển nội dung của một kho lưu trữ ( repo1) sang kho lưu trữ hiện có khác ( repo2) bằng các lệnh sau:

git clone repo1
git clone repo2
cd repo1
git remote rm origin
git remote add repo1
git push

Nhưng nó không hoạt động. Tôi đã xem lại một bài viết tương tự, nhưng tôi chỉ tìm thấy một bài di chuyển thư mục, không phải nội dung.


Bạn có muốn có nội dung của repo1 như một nhánh trên repo2 hoặc là một phần của chủ, vì vậy các thư mục của cả hai repos cùng tồn tại trong thư mục làm việc của bạn không?
Biên niên sử

Tôi muốn di chuyển nó như là một phần của chủ.
Mario

4
Hướng dẫn này là hoàn hảo! smashingmagazine.com/2014/05/19/ cường
xpto

Câu trả lời:


242

Tôi nghĩ rằng các lệnh bạn đang tìm kiếm là:

cd repo2
git checkout master
git remote add r1remote **url-of-repo1**
git fetch r1remote
git merge r1remote/master --allow-unrelated-histories
git remote rm r1remote

Sau đó repo2/mastersẽ chứa mọi thứ từ repo2/masterrepo1/master, và cũng sẽ có lịch sử của cả hai.


Cảm ơn Chronial, tôi chỉ muốn chắc chắn rằng repo1 cũng có một nhánh và nếu tôi muốn chuyển nhánh đó sang repo2 thì sao?
Mario

tốt, repo2 cũng có một nhánh thứ hai? Hay điều gì sẽ xảy ra với chi nhánh đó?
Biên niên sử

1
Chronial, các đồng chí trên đã không làm việc! nó đã không sao chép lịch sử.
Mario

1
OK, bây giờ nó đã làm việc. Tôi đã sử dụng lệnh sau; cd repo2,> git remote rm origin> git remote add origin url-of-repo1 ,> git fetch r1remote> git push origin master
Mario

1
@abhijithda Giải pháp đơn giản nhất là chỉ cần di chuyển mọi thứ bên trong repo1vào thư mục con (bên trong repo1) trước khi bạn thực hiện hợp nhất.
Biên niên sử

55

Mô tả hoàn hảo tại đây https://www.smashingmagazine.com/2014/05/moving-git-reposeective-new-server/

Đầu tiên, chúng ta phải tìm nạp tất cả các nhánh và thẻ từ xa từ kho lưu trữ hiện có đến chỉ mục cục bộ của chúng tôi:

git fetch origin

Chúng tôi có thể kiểm tra bất kỳ nhánh bị thiếu nào mà chúng tôi cần để tạo một bản sao cục bộ của:

git branch -a

Hãy sử dụng URL nhân bản SSH của kho lưu trữ mới của chúng tôi để tạo một điều khiển từ xa mới trong kho lưu trữ cục bộ hiện có của chúng tôi:

git remote add new-origin git@github.com:manakor/manascope.git

Bây giờ chúng tôi đã sẵn sàng để đẩy tất cả các chi nhánh và thẻ cục bộ sang điều khiển từ xa mới có tên new-origin:

git push --all new-origin 
git push --tags new-origin

Hãy tạo nguồn gốc mới từ xa mặc định:

git remote rm origin

Đổi tên nguồn gốc mới thành nguồn gốc, để nó trở thành điều khiển từ xa mặc định:

git remote rename new-origin origin

4
Có thể xác nhận rằng điều này sao chép toàn bộ lịch sử và thẻ. Rất đẹp. Cảm ơn.
Alex

Nếu nguồn gốc mới không có bất kỳ cam kết nào, nó hoạt động tốt. Tuy nhiên, nếu có bất kỳ cam kết nào trong nguồn gốc mới, cách được đề cập ở đây sẽ không diễn ra như mong đợi.
caot

bạn cần swtich git checkout BranchNamechi nhánh với sau đó đẩy chi nhánh đến repo từ xa một lần nữa với git push --all new-origin nhưng cảm ơn rất nhiều
Raad Altaie

21

Nếu bạn đang tìm cách bảo tồn các chi nhánh hiện có và cam kết lịch sử, đây là một cách làm việc cho tôi.

git clone --mirror https://github.com/account/repo.git cloned-repo
cd cloned-repo
git push --mirror {URL of new (empty) repo}

# at this point only remote cloned-repo is correct, local has auto-generated repo structure with folders such as "branches" or "refs"
cd ..
rm -rf cloned-repo
git clone {URL of new (empty) repo}
# only now will you see the expected user-generated contents in local cloned-repo folder

# note: all non-master branches are avaialable, but git branch will not show them until you git checkout each of them
# to automatically checkout all remote branches use this loop:
for b in `git branch -r | grep -v -- '->'`; do git branch --track ${b##origin/} $b; done

Bây giờ, giả sử bạn muốn giữ đồng bộ nguồn và đích trong một khoảng thời gian. Ví dụ: vẫn còn hoạt động trong repo từ xa hiện tại mà bạn muốn mang đến repo mới / thay thế.

git clone -o old https://github.com/account/repo.git my-repo
cd my-repo
git remote add new {URL of new repo}

Để kéo xuống các bản cập nhật mới nhất (giả sử bạn không có thay đổi cục bộ):

git checkout {branch(es) of interest}
git pull old
git push --all new

Lưu ý: Tôi vẫn chưa sử dụng các mô hình con, vì vậy tôi không biết những bước bổ sung nào có thể được yêu cầu nếu bạn có chúng.


1
Điều này làm việc đơn giản và dễ dàng cho tôi. Tôi nghĩ rằng nó nên được trả lời kiểm tra. Nếu bạn có 60 chi nhánh, đây là con đường để đi.
rickfoosusa

7

Cách tiếp cận đơn giản nhất nếu mã đã được Git theo dõi, sau đó đặt kho lưu trữ mới làm "nguồn gốc" của bạn để đẩy tới.

cd existing-project
git remote set-url origin https://clone-url.git
git push -u origin --all
git push origin --tags

6

Điều này đã làm việc để chuyển repo địa phương của tôi (bao gồm cả lịch sử) sang repo github.com từ xa của tôi. Sau khi tạo repo trống mới tại GitHub.com, tôi sử dụng URL ở bước ba bên dưới và nó hoạt động rất tốt.

git clone --mirror <url_of_old_repo>
cd <name_of_old_repo>
git remote add new-origin <url_of_new_repo>
git push new-origin --mirror

Tôi đã tìm thấy điều này tại: https://gist.github.com/niksumeiko/8972566


1
Đây là cách dễ nhất để cho kho lưu trữ ban đầu. Nó cũng sao chép tất cả các chi nhánh.
Guillermo

1
Điều này cũng sao chép tất cả các thẻ.
quạ

2

Tôi đã sử dụng phương pháp dưới đây để di chuyển GIT Stash của mình sang GitLab bằng cách duy trì tất cả các nhánh và lịch sử cam kết.

Nhân bản kho lưu trữ cũ sang địa phương.

git clone --bare <STASH-URL>

Tạo một kho lưu trữ trống trong GitLab.

git push --mirror <GitLab-URL>

1

Có vẻ như bạn đang ở gần. Giả sử rằng đó không chỉ là một lỗi đánh máy trong bài nộp của bạn, bước 3 nên cd repo2thay vì repo1. Và bước 6 không nên git pullđẩy. Danh sách làm lại:

1. git clone repo1
2. git clone repo2
3. cd repo2
4. git remote rm origin
5. git remote add repo1
6. git pull
7. git remote rm repo1
8. git remote add newremote

Cảm ơn Eric, nhưng trong bước 3 tôi muốn xóa liên kết của kho lưu trữ ban đầu để tránh thực hiện bất kỳ thay đổi từ xa nào .. vì tôi muốn chuyển nội dung từ repo1 sang repo2.
Mario

Ổn thỏa. Tôi đã chỉnh sửa câu trả lời của mình để cố gắng phản ánh điều đó. Để chắc chắn, bạn đang cố gắng tạo một kho lưu trữ, repo2, đó là bản sao của repo1 nhưng không giữ lại repo1 hoặc nguồn gốc dưới dạng từ xa?
Cung điện Eric

Không, tôi không cố tạo một repo mới "repo2". Trên thực tế, tôi có một repo2 hiện có các nội dung khác init. Bây giờ tôi muốn chuyển tất cả nội dung repo1 vào repo2 với lịch sử. Tôi sẽ giữ repo1 trống như trong máy chủ.
Mario

Bạn đã cân nhắc việc không sử dụng git? Có vẻ như bạn có thể chỉ cần sao chép các tệp (thông qua gui hoặc scp hoặc ftp) và thêm chúng vào thủ công git repo của bạn. Nó có thể không hiệu quả, nhưng nó có thể đơn giản hơn.
Cung điện Eric

Tôi đã thử nó nhưng nó đã để lại lịch sử. Tôi muốn di chuyển tất cả lịch sử của nó là tốt.
Mario

1

Theo @ Dan-Cohn trả lời Mirror-đẩy là bạn của bạn ở đây. Đây là mục đích của tôi để di chuyển repos:

Phản chiếu một kho lưu trữ

1.Mở Git Bash.

2. Tạo một bản sao trần của kho lưu trữ.

$ git clone --bare https://github.com/exampleuser/old-repository.git

3.Mirror-đẩy đến kho lưu trữ mới.

$ cd old-repository.git
$ git push --mirror https://github.com/exampleuser/new-repository.git

4.Xóa kho lưu trữ cục bộ tạm thời bạn đã tạo ở bước 1.

$ cd ..
$ rm -rf old-repository.git

Tham khảo và tín dụng: https://help.github.com/en/articles/d repeatating-a-reposeective


-1

Có rất nhiều câu trả lời phức tạp, ở đây; tuy nhiên, nếu bạn không quan tâm đến việc bảo quản chi nhánh, tất cả những gì bạn cần làm là đặt lại nguồn gốc từ xa, đặt ngược dòng và đẩy.

Điều này làm việc để bảo tồn tất cả lịch sử cam kết cho tôi.

cd <location of local repo.>
git remote set-url origin <url>
git push -u origin master
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.