GitHub: Halka açık bir depo çatalını nasıl özel yapabilirim?


247

Halka açık bir havuzu nasıl çatallayabilirim, ancak çatalımı özel yapabilirim? Özel depoları destekleme aboneliğim var.

Yanıtlar:


394

Yanıtlar doğrudur, ancak genel repo ile çatal arasındaki kodu nasıl senkronize edeceğinizden bahsetmiyoruz.

İşte tam iş akışı (bunu açık kaynak React Native'den önce yaptık ):


İlk olarak, repoyu diğerlerinin söylediği gibi çoğaltın (ayrıntılar burada ):

Github kullanıcı arayüzüprivate-repo üzerinden yeni bir repo oluşturun (diyelim ) . Sonra:

git clone --bare https://github.com/exampleuser/public-repo.git
cd public-repo.git
git push --mirror https://github.com/yourname/private-repo.git
cd ..
rm -rf public-repo.git

Üzerinde çalışabilmek için özel repoyu kopyalayın:

git clone https://github.com/yourname/private-repo.git
cd private-repo
make some changes
git commit
git push origin master

Halka açık repodan yeni sıhhat çekmek için:

cd private-repo
git remote add public https://github.com/exampleuser/public-repo.git
git pull public master # Creates a merge commit
git push origin master

Harika, özel repo şimdi halka açık repo son değişiklik artı artı değişikliklere sahip.


Son olarak, bir çekme isteği özel repo oluşturmak için -> genel repo:

Genel repo çatalını (genel repo sayfasının sağ üst kısmındaki küçük "Çatal" düğmesi) oluşturmak için GitHub kullanıcı arayüzünü kullanın. Sonra:

git clone https://github.com/yourname/the-fork.git
cd the-fork
git remote add private_repo_yourname https://github.com/yourname/private-repo.git
git checkout -b pull_request_yourname
git pull private_repo_yourname master
git push origin pull_request_yourname

Şimdi burada açıklandığı gibi, genel repo için Github UI aracılığıyla bir çekme isteği oluşturabilirsiniz .

Proje sahipleri çekme talebinizi inceledikten sonra birleştirebilirler.

Tabii ki tüm süreç tekrarlanabilir (sadece uzaktan kumanda eklediğiniz adımları bırakın).


2
Neden boş özel repo, halka açık repodaki normal bir klona yeni bir uzaktan kumanda olarak eklenip uzaktan kumandaya itilemiyor? Ne fark eder ki?
Falko Menge

@FalkoMenge Aynı sorum var. Okuma git-scm.com/docs/git-clone normal gibi geliyor git cloneuzaktan izleme şube kuracak ve belki klonlanmış repo bazı diğer yapılandırma gerçekten istemiyorum. Oysa - çıplak bir klon, uzaktan kumandadan olduğu gibi .git dizinini kopyalar.
bennlich

1
Bu da özel taahhüt tarihini kamu koluna itecek mi?
Sukhjinder Singh

1
@Sukhjinder Singh Evet, son adım özel taahhüt tarihini kamuoyuna itecek. Bunu istemiyorsanız, taahhütlerinizi halka açık repo ile birleştirirken ezebilir ve tüm değişikliklerinizle tek bir taahhütte bulunabilirsiniz. Bkz. Örneğin stackoverflow.com/questions/5308816/how-to-use-git-merge-squash
Martin Konicek

1
Özel depomu klonladığım yere adım atmam ve bir değişiklik yapmam ve sonra itmem gerekiyor. Yaptığım herhangi bir değişiklik git tarafından fark edilmedi. git statusher şeyi güncel gösterir, ne değiştirirsek değiştirelim, ağaç temiz kalır. Sonuç olarak hiçbir şey yapamıyorum ve zorlayamıyorum. Bunu denemek için 2 kez daha yaptığım yeni özel repoyu sildim ama aynı sorunla karşılaşmaya devam ettim. Baska öneri?
İrade

92

Şimdi bir seçenek daha var (Ocak-2015)

  1. Yeni bir özel repo oluştur
  2. Boş repo ekranında "içe aktar" seçeneği / düğmesi var resim açıklamasını buraya girin
  3. tıklayın ve mevcut github repo url koymak Github seçeneği söz yok ama github depoları ile de çalışır. resim açıklamasını buraya girin
  4. YAPILAN

19
Bu biraz farklı da olsa işe yarıyor. (Ağustos 2015'te denedim). İçe aktarma seçeneğini / düğmesini bulamadım, bu yüzden googled ve bu URL'de sona erdi. import.github.com/new Buraya, mevcut github URL'sini girebilir ve Kontrol et düğmesini tıklayabilirsiniz. Doğrulandıktan sonra, yeni deponuzun adını girip Özel düğmesini tıklayabilir ve ardından İçe
Shiva

2
@MattvanAndel, orijinal cevap değil, yorumun doğru olduğu anlamına geliyor. Ben de Shiva'nın yorumunu takip ettim ve işe yaradı. Öncelikle yerel özel havuzu oluşturmamanız gerektiğini unutmayın!
David H

Bu şekilde özel bir "çatal" oluşturup tekrar genel çatal yapmak istiyorsam, bunu yapabilir miyim?
Anders Lindén

2
@Shiva Yorumunuzdan cevap verirseniz oylayacağım.
bebbi

36

Mevcut cevaplar biraz güncelliğini yitirmiştir.

Kısa cevap:

  1. Bir Do çıplak klonKamuya açık repo .
  2. Yeni bir özel tane oluşturun.
  3. Bir Do ayna itmek yeni özel birine.

Bu GitHub'da belgelenmiştir: deponun çoğaltılması


4
Yukarı akış değişikliklerini çekmenin bir yolu var mı? Bu, liberal bir lisansı olan bir repo için önemlidir - repo'yu özel yaptım, ancak yine de yukarı akım değişikliklerini birleştirmek istiyorum.
amarprabhu

2
Evet. Diğer repo'yu yeni (izleme) bir uzaktan kumanda olarak ekleyebilmeniz (örn. 'Other-repo') ve daha sonra bu değişiklikleri düzenli olarak getirip birleştirebilmeniz gerekir (örn. 'Git merge other-repo / stabil').
stefano

26

Repoyu kopyalamanız gerekiyor

Bu dokümanı görebilirsiniz (github'dan)

Bir havuzun çatalsız kopyasını oluşturmak için, orijinal depoya karşı özel bir klon komutu çalıştırmanız ve yenisine ayna aktarmanız gerekir.

Aşağıdaki durumlarda, örnek kullanıcı / yeni veri havuzu veya örnek kullanıcı / yansıtılmış gibi aktarmaya çalıştığınız havuz GitHub'da zaten var olmalıdır. Daha fazla bilgi için bkz. "Yeni bir havuz oluşturma".

Bir havuzu yansıtma

Kesin bir kopya yapmak için hem çıplak klon hem de ayna itme yapmanız gerekir.

Komut satırını açın ve şu komutları yazın:

$ git clone --bare https://github.com/exampleuser/old-repository.git
# Make a bare clone of the repository

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

$ cd ..
$ rm -rf old-repository.git
# Remove our temporary local repository

Bir deposu orijinalinden güncelleme almak da dahil olmak üzere başka bir konumda yansıtmak istiyorsanız, bir aynayı klonlayabilir ve değişiklikleri düzenli olarak itebilirsiniz.

$ git clone --mirror https://github.com/exampleuser/repository-to-mirror.git
# Make a bare mirrored clone of the repository

$ cd repository-to-mirror.git
$ git remote set-url --push origin https://github.com/exampleuser/mirrored
# Set the push location to your mirror

Çıplak bir klonda olduğu gibi, yansıtılmış bir klon tüm uzak dalları ve etiketleri içerir, ancak her getirdiğinizde tüm yerel referansların üzerine yazılır, bu nedenle her zaman orijinal havuzla aynı olacaktır. İtme URL'sini ayarlamak aynanıza itmeyi kolaylaştırır. Aynanızı güncellemek için, bir cron işi çalıştırarak otomatikleştirilebilecek güncellemeleri ve push'ları alın.

$ git fetch -p origin
$ git push --mirror

https://help.github.com/articles/duplicating-a-repository


Bu, deponun bir klonunu oluşturur, ancak GitHub anlamında bir çatal oluşturmaz . GitHub'da gerçek bir çatal oluşturduğunuzda, çatal adının altında "exampleuser / havuzdan aynaya çatallı" metni gösterilir. Ayrıca, github.com/exampleuser/new-repository/network/members öğesine gittiğinizde diğer tüm çatallardan oluşan bir ağaç gösterir.
apaatsio

20

GitHub'da artık yeni içe aktarılan depo genel veya özel istediğinizi seçmenizi sağlayan bir içe aktarma seçeneği var

Github Deposu içe aktarma


İçe aktarma hala büyük bir depoda (5 gün) çalışıyor, bunları kontrol etmek çok daha hızlı, ancak güncel tutmak için daha fazla adım olabilir. Yavaşlık anlaşılabilir Herhalde sadece ana dalı değil, her şeyi ithal ettiği için, ama keşke daha hızlı olsaydı ...
Liam Mitchell

1
Aynı cevabı ekleyecektim ama önce yaptığınız için teşekkür ederim. Github Free özel depolarının geçen yıl Ocak ayından bu yana mevcut olmasına sevindim. : D
OBL
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.