Git mevcut repoyu yeni ve farklı bir uzak repo sunucusuna aktarıyor mu?


494

Git.fedorahosted.org üzerinde bir havuzum olduğunu ve fedorahosted'daki daha "resmi" repo dışında kendi oyun alanımın olması için bunu github'daki hesabıma kopyalamak istiyorum. Bunu başlangıçta kopyalamak için atılacak adımlar ne olurdu? Github içinde bu güzel "çatal" düğmesi var, ama bunu bariz nedenlerle kullanamıyorum.

Ve fedorahosted deposundaki değişiklikleri github'a nasıl izlerim?

Yanıtlar:


751
  1. Github'da yeni bir repo oluşturun.
  2. Repora fedorahosted'dan yerel makinenize kopyalayın.
  3. git remote rename origin upstream
  4. git remote add origin URL_TO_GITHUB_REPO
  5. git push origin master

Şimdi onunla diğer github repoları gibi çalışabilirsiniz. Yamaları yukarı akıştan çekmek için çalıştırın git pull upstream master && git push origin master.


14
Orijinal kökeni yeniden adlandırmak için bir neden yok, sadece yeni oyun alanını başka bir şey olarak adlandırın.
tacaswell

34
@tcaswell Teknik olarak hayır, ancak originkanonik uzak konumu işaret eden güçlü bir sözleşmedir . Bu durumda, github yeri muhtemelen kanonik olacaktır.
troelskn

1
'Memba' yı kanonik yer olarak görüyorum, ama bence bu saçları bölmeye başlıyor.
tacaswell

3
Belki farklı bir soru yayınlamalıyım ama bence siz ne istediğimi tartışıyorsunuz. Yeni bir uzaktan kumanda eklemek istiyorum, mevcut depoyu değiştirmiyorum, böylece eski depodan çekmeye devam edebilirim, ancak herhangi bir değişikliği yenisiyle değiştirebilirim.
ThatAintWorking

13
@ThatAintWorking Muhtemelen yeni bir soru açmalısınız, ancak kısaca - komutla istediğiniz sayıda uzaktan kumanda ekleyebilirsiniz git remote add. Daha sonra uzaktan kumandayı açıkça belirterek bunlardan birine basabilirsiniz git push. Örneğin git push foobar master, geçerli dalı masteruzaktan kumandaya itmek için foobar.
troelskn

108

Bu soruda yararlı bir bağlantısı olan silinmiş bir cevap var: https://help.github.com/articles/duplicating-a-repository

Öz,

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

OP örneği:

Yerel makinenizde

$ 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
Çıplak klonun ve ayna itmesinin başka bir uzaktan kumandayı ekleyip itmenin faydası nedir? Sadece mevcut dal değil tüm dallar da itilecek mi? (Öyleyse, bu dikkat edilmesi gereken kabul edilen cevabın bir sınırlaması gibi görünüyor.)
yoyo

3
Bu tam olarak aradığım bilgi, --bare / --mirror genellikle insanların gerçekleştirmek istediği şey! Bu önemli bir cevap! Teşekkürler
claf

1
Harika! Konu sorusu üzerine kesinlikle en doğru cevap. Teşekkürler! Eğer böyle yapmazsam, daima alıyorumerror: failed to push some refs to 'https://github.com/username/testrep.git'
Denis Babarykin

45

Mevcut deponuzu farklı hale getirmek için şunları yapmanız gerekir:

  1. İlk önce orijinal repoyu kopyalayın.

    git clone https://git.fedorahosted.org/cgit/rhq/rhq.git
    
  2. Klonlanan kaynakları yeni deponuza aktarın:

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

Değiştirebilirsiniz master:master içine source:destinationdal.


Belirli bir taahhüdü (şube) göndermek istiyorsanız, şunları yapın:

  1. Orijinal repoda yeni bir şube oluşturun ve ödeme yapın:

    git checkout -b new_branch
    
  2. Başlamak istediğiniz noktayı seçin ve sıfırlayın:

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

    Alternatif git cherry-pickolarak mevcut HEAD'e ekleme taahhüdünü seçin .

  3. Ardından yeni deponuza itin:

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

    Yeniden temelliyorsanız, -fzorlamak için kullanın (önerilmez). git reflogDeğişikliklerin geçmişini görmek için çalıştırın .


2
git push ... old_branch_name:new_branch_nameYeni depoda ana dal olarak eski deposundan bir özellik dalı itmek için izin verir. Faydalı!
gorjanz

Bunu yapmanın en basit yolu buydu.
Adam

15

Gerçekten yerel deponuzu (yerel şubeleri vb.) Yeni uzaktan kumandaya itmek mi istiyorsunuz yoksa gerçekten eski uzaktan kumandayı (tüm şubeleri, etiketleri vb.) Yeni uzaktan kumandaya yansıtmak istiyor musunuz? İkincisi, bir git deposunu düzgün bir şekilde nasıl yansıtacağınız konusunda harika bir blog .

Bazı çok önemli ayrıntılar için blogu okumanızı şiddetle tavsiye ediyorum, ancak kısa versiyon şudur:

Yeni bir dizinde şu komutları çalıştırın:

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


11

Bunu deneyin tam Git depo taşımak için How

  1. Şunu kullanarak temp-dir dizininde yerel bir havuz oluşturun:

    git clone temp-dir

  2. Temp-dir dizinine gidin.

  3. ORI'deki farklı şubelerin bir listesini görmek için:

    git branch -a
    
  4. ORI'den NEW'a kopyalamak istediğiniz tüm dalları kullanarak şunları kontrol edin:

    git checkout branch-name
    
  5. Şimdi ORI'deki tüm etiketleri kullanarak şunları getirin:

    git fetch --tags
    
  6. Bir sonraki adımı uygulamadan önce, aşağıdaki komutları kullanarak yerel etiketlerinizi ve dallarınızı kontrol ettiğinizden emin olun:

    git tag
    
    
    git branch -a
    
  7. Şimdi aşağıdaki komutla ORI deposunun bağlantısını temizleyin:

    git remote rm origin
    
  8. Şimdi aşağıdaki komutu kullanarak yerel deponuzu yeni oluşturulan YENİ deponuza bağlayın:

    git remote add origin <url to NEW repo>
    
  9. Şimdi tüm şubelerinizi ve etiketlerinizi şu komutlarla itin:

    git push origin --all
    
    
    git push --tags
    
  10. Artık ORI deponuzdan tam bir kopyanız var.


9

Kısa ve anlaşılması oldukça kolay olan set-url kullanarak bir çözüm buldum :

  1. Github'da yeni bir repo yarat
  2. cd yerel makinenizdeki mevcut depoya (henüz klonlamadıysanız, önce bunu yapın)
  3. git remote set-url origin https://github.com/user/example.git
  4. git push -u origin master

9

Mevcut Git deponuz varsa:

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
Sadece açıklığa kavuşturmak için, --tüm tüm dalları zorlayacak
GilCol

7

Şu komutla GIT repo URL'sini değiştirerek yeni repoyu işaretlemeniz yeterlidir:

git remote set-url origin [new repo URL]

Misal: git remote set-url origin git@bitbucket.org:Batman/batmanRepoName.git

Şimdi itme ve çekme yeni REPO'ya bağlanıyor.

Sonra normal şekilde itin:

git push -u origin master

2

Aynı sorunu yaşadım.

Benim durumumda, yerel makinemdeki orijinal depoya sahip olduğum için, herhangi bir gizli dosya (.git, .gitignore) olmadan yeni bir klasörde bir kopya oluşturdum.

Son olarak .gitignore dosyasını yeni oluşturulan klasöre ekledim.

Sonra yerel depodan yeni depomuzu oluşturdum ve ekledim (benim durumumda GitHub Desktop kullanarak).


1

İşte yapmanın manuel bir yolu git remote set-url origin [new repo URL]:

  1. Depoyu klonlayın: git clone <old remote>
  2. GitHub deposu oluşturma
  3. Açık <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
    

    uzaktan kumandayı değiştirin (url seçeneği)

    [remote "origin"]
        url = <new remote>
        fetch = +refs/heads/*:refs/remotes/origin/*
    
  4. Havuzu GitHub'a aktarın: git push

Her iki / birden çok uzaktan kumandayı da kullanabilirsiniz .


Aynı sorunu arıyordum ve sonra da aynısını yaptım ve çalıştım.
Mohit Patidar
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.