Git đẩy repo hiện có đến một máy chủ repo từ xa mới và khác?


494

Giả sử tôi có một kho lưu trữ trên git.fedorahosted.org và tôi muốn sao chép tài khoản này vào tài khoản của mình tại github để có sân chơi riêng ngoài repo "chính thức" hơn trên fedorahosted. Điều gì sẽ là các bước để sao chép ban đầu đó? Trong github có nút "ngã ba" đẹp này, nhưng tôi không thể sử dụng nó vì những lý do rõ ràng.

Và làm thế nào tôi có thể theo dõi các thay đổi trong repo được liên kết thành một github?

Câu trả lời:


751
  1. Tạo một repo mới tại github.
  2. Sao chép repo từ fedorahosted vào máy cục bộ của bạn.
  3. git remote rename origin upstream
  4. git remote add origin URL_TO_GITHUB_REPO
  5. git push origin master

Bây giờ bạn có thể làm việc với nó giống như bất kỳ repo github khác. Để kéo các bản vá từ thượng nguồn, chỉ cần chạy git pull upstream master && git push origin master.


14
Không có lý do để đổi tên nguồn gốc ban đầu, chỉ cần gọi sân chơi mới một cái gì đó khác.
tacaswell

34
@tcaswell Về mặt kỹ thuật thì không, nhưng đó là một quy ước mạnh mẽ originchỉ ra vị trí từ xa chính tắc. Trong trường hợp này, vị trí github có lẽ sẽ là chính tắc.
troelskn

1
Tôi sẽ coi "thượng nguồn" là vị trí kinh điển, nhưng tôi nghĩ rằng đây là bắt đầu để chia tóc.
tacaswell

3
Có lẽ tôi nên đăng một câu hỏi khác nhưng tôi nghĩ các bạn đang thảo luận về những gì tôi muốn. Tôi muốn thêm một điều khiển từ xa mới, không thay thế cái hiện có để tôi có thể tiếp tục lấy từ kho lưu trữ cũ mà đẩy bất kỳ thay đổi nào sang cái mới.
ThatAintWorking

13
@ThatAintWorking Có lẽ bạn nên mở một câu hỏi mới, nhưng tóm lại - bạn có thể thêm bất kỳ số lượng từ xa nào bằng lệnh git remote add. Sau đó, bạn có thể đẩy một trong số chúng bằng cách nói rõ điều khiển từ xa git push. Ví dụ git push foobar masterđể đẩy chi nhánh hiện tại mastervào từ xa foobar.
troelskn

108

Có một câu trả lời đã bị xóa trong câu hỏi này có một liên kết hữu ích: https://help.github.com/articles/d repeatating-a-reposeective

Ý chính là

0. create the new empty repository (say, on github)
1. make a bare clone of the repository in some temporary location
2. change to the temporary location
3. perform a mirror-push to the new repository
4. change to another location and delete the temporary location

Ví dụ của OP:

Trên máy cục bộ của bạn

$ cd $HOME
$ git clone --bare https://git.fedorahosted.org/the/path/to/my_repo.git
$ cd my_repo.git
$ git push --mirror https://github.com/my_username/my_repo.git
$ cd ..
$ rm -rf my_repo.git

5
Lợi ích của bản sao trần và gương đẩy qua chỉ cần thêm và đẩy sang một điều khiển từ xa khác là gì? Có phải tất cả các chi nhánh sẽ được đẩy và không chỉ là chi nhánh hiện tại? (Nếu vậy, điều này có vẻ như là một giới hạn của câu trả lời được chấp nhận cần được lưu ý.)
yoyo

3
Đây chính xác là thông tin tôi đang tìm kiếm, --bare / --mirror thường là những gì mọi người muốn thực hiện! Đây là một câu trả lời quan trọng! Cảm ơn
claf

1
Tuyệt quá! Chắc chắn câu trả lời đúng nhất cho câu hỏi chủ đề. Cảm ơn! Nếu tôi không làm như thế này, tôi sẽ luôn nhận đượcerror: failed to push some refs to 'https://github.com/username/testrep.git'
Denis Babarykin

45

Để đẩy repo hiện tại của bạn thành khác nhau, bạn cần:

  1. Nhân bản repo gốc trước.

    git clone https://git.fedorahosted.org/cgit/rhq/rhq.git
    
  2. Đẩy các nguồn nhân bản vào kho lưu trữ mới của bạn:

    cd rhq
    git push https://github.com/user/example master:master
    

Bạn có thể thay đổi master:masterthành source:destinationchi nhánh.


Nếu bạn muốn đẩy cam kết cụ thể (chi nhánh), thì hãy làm:

  1. Trên repo gốc, tạo và kiểm tra một nhánh mới:

    git checkout -b new_branch
    
  2. Chọn và đặt lại đến điểm bạn muốn bắt đầu:

    git log # Find the interesting hash
    git reset 4b62bdc9087bf33cc01d0462bf16bbf396369c81 --hard
    

    Hoặc chọn cam kết bằng cách git cherry-picknối vào ĐẦU hiện có.

  3. Sau đó đẩy sang repo mới của bạn:

    git push https://github.com/user/example new_branch:master
    

    Nếu bạn đang nổi loạn, hãy sử dụng -flực đẩy (không nên dùng). Chạy git reflogđể xem lịch sử thay đổi.


2
các git push ... old_branch_name:new_branch_namephép bạn để đẩy một chi nhánh tính năng từ kho cũ như các chi nhánh chính trong kho mới. Sử dụng đầy đủ!
gorjanz

Đây là cách đơn giản nhất để tôi làm điều đó.
Adam

15

Bạn có thực sự muốn đơn giản đẩy kho lưu trữ cục bộ của mình (với các nhánh cục bộ, v.v.) sang điều khiển từ xa mới hay bạn thực sự muốn phản chiếu điều khiển từ xa cũ (với tất cả các nhánh, thẻ, v.v.) trên điều khiển mới? Nếu sau đây là một blog tuyệt vời về Cách phản chiếu đúng kho lưu trữ git .

Tôi đặc biệt khuyến khích bạn đọc blog để biết một số chi tiết rất quan trọng, nhưng phiên bản ngắn là đây:

Trong một thư mục mới chạy các lệnh này:

git clone --mirror git@example.com/upstream-repository.git
cd upstream-repository.git
git push --mirror git@example.com/new-location.git

Tôi nghĩ rằng đây là liên kết: blog.plataformatec.com.br/2013/05/ trên
David

11

Hãy thử cách này để di chuyển một kho Git đầy đủ

  1. Tạo một kho lưu trữ cục bộ trong thư mục temp-dir bằng cách sử dụng:

    git clone temp-dir

  2. Đi vào thư mục temp-dir.

  3. Để xem danh sách các chi nhánh khác nhau trong ORI, hãy làm:

    git branch -a
    
  4. Kiểm tra tất cả các chi nhánh mà bạn muốn sao chép từ ORI sang MỚI bằng cách sử dụng:

    git checkout branch-name
    
  5. Bây giờ hãy tìm nạp tất cả các thẻ từ ORI bằng cách sử dụng:

    git fetch --tags
    
  6. Trước khi thực hiện bước tiếp theo, hãy đảm bảo kiểm tra các thẻ và nhánh cục bộ của bạn bằng các lệnh sau:

    git tag
    
    
    git branch -a
    
  7. Bây giờ xóa liên kết đến kho lưu trữ ORI bằng lệnh sau:

    git remote rm origin
    
  8. Bây giờ liên kết kho lưu trữ cục bộ của bạn với kho lưu trữ MỚI vừa tạo bằng lệnh sau:

    git remote add origin <url to NEW repo>
    
  9. Bây giờ đẩy tất cả các nhánh và thẻ của bạn bằng các lệnh sau:

    git push origin --all
    
    
    git push --tags
    
  10. Bây giờ bạn có một bản sao đầy đủ từ repo ORI của bạn.


9

Tôi tìm thấy một giải pháp sử dụng thiết url đó là ngắn gọn và khá dễ hiểu :

  1. tạo một repo mới tại Github
  2. cd vào kho lưu trữ hiện có trên máy cục bộ của bạn (nếu bạn chưa sao chép nó, thì hãy làm điều này trước)
  3. git remote set-url origin https://github.com/user/example.git
  4. git push -u origin master

9

Nếu bạn có kho Git hiện có:

cd existing_repo
git remote rename origin old-origin
git remote add origin https://gitlab.com/newproject
git push -u origin --all
git push -u origin --tags

1
Chỉ cần làm rõ, - sẽ đẩy tất cả các chi nhánh
GilCol

7

Chỉ cần trỏ repo mới bằng cách thay đổi URL repo GIT bằng lệnh này:

git remote set-url origin [new repo URL]

Thí dụ: git remote set-url origin git@bitbucket.org:Batman/batmanRepoName.git

Bây giờ, đẩy và kéo được liên kết với REPO mới.

Sau đó đẩy bình thường như vậy:

git push -u origin master

2

Tôi đã có cùng một vấn đề.

Trong trường hợp của tôi, vì tôi có kho lưu trữ ban đầu trong máy cục bộ của mình, tôi đã tạo một bản sao trong một thư mục mới mà không có bất kỳ tệp ẩn nào (.git, .gitignore).

Cuối cùng tôi đã thêm tệp .gitignore vào thư mục mới tạo.

Sau đó, tôi đã tạo và thêm kho lưu trữ mới từ đường dẫn cục bộ (trong trường hợp của tôi bằng GitHub Desktop).


1

Đây là một cách thủ công để làm git remote set-url origin [new repo URL]:

  1. Nhân bản kho lưu trữ: git clone <old remote>
  2. Tạo kho lưu trữ GitHub
  3. Mở <repository>/.git/config

    $ git config -e
    
    [core]
        repositoryformatversion = 0
        filemode = false
        bare = false
        logallrefupdates = true
        symlinks = false
        ignorecase = true
    [remote "origin"]
        url = <old remote>
        fetch = +refs/heads/*:refs/remotes/origin/*
    [branch "master"]
        remote = origin
        merge = refs/heads/master
    

    và thay đổi điều khiển từ xa (tùy chọn url)

    [remote "origin"]
        url = <new remote>
        fetch = +refs/heads/*:refs/remotes/origin/*
    
  4. Đẩy kho lưu trữ đến GitHub: git push

Bạn cũng có thể sử dụng cả hai / nhiều điều khiển từ xa .


Tôi đã tìm kiếm cùng một vấn đề và sau đó làm tương tự và làm việc ra.
Mohit Patidar
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.