Git dalı bir uzaktan kumandadan diğerine itiyor mu?


133

Aşağıdaki uzaktan kumandaları kurdum:

$ git remote 
korg
rorg

Ve aşağıdaki dallar:

$ git branch -a
* (no branch)
  remotes/korg/gingerbread
  remotes/korg/gingerbread-release
  remotes/korg/honeycomb
  remotes/korg/honeycomb-mr1-release
  remotes/korg/master
  remotes/m/android-2.3.3_r1 -> refs/tags/android-2.3.3_r1a
  remotes/m/gingerbread -> korg/gingerbread

Şimdi ben tüm uzak dalları itmek isteyen korgiçin rorguzaktan. Bunu nasıl yaparım?

Önlenebilirse, tercihen her bir ilk için yerel bir şube yapmadan.


Sanırım bu sorunun cevabı bunun cevabı ile karşılaştırılabilir: stackoverflow.com/questions/6922700/… .
Legolas

Yanıtlar:


52

Bazı geçici depolar yapmak için hızlı bir test, bunu yapabilecek bir refspec oluşturabileceğinizi gösterir:

$ git push rorg origin/one:refs/heads/one
Counting objects: 5, done.
Writing objects: 100% (3/3), 240 bytes, done.
Total 3 (delta 0), reused 0 (delta 0)
Unpacking objects: 100% (3/3), done.
To /tmp/rorg
 * [new branch]      origin/one -> one

Öyleyse kaynak / BRANCHNAME: refs / head / BRANCHNAME

rorgUzaktan kumandama bakıyorum:

pat@host /tmp/rorg (BARE:master)
$ git graph --all
* 5750bca (HEAD, master) c
| * 13fd55a (one) b
|/
* 822e0de a

5
Neden yerine git push rorg origin/one:one(olmadan refs/heads/) değil?
Ali

2
@exalted, çünkü refs/heads/önek ile kontrol edilmesi gerekmeyen uzak dallara one
itiyorsunuz

@patthoyts Bahsedilen komutu denedim, her şeyin güncel olduğunu söylüyor, Ama uzaktaki A'da 10 ve uzak B'de 6 şubem var, lütfen bana kalan dalları nasıl hareket ettirebilirim?
Keshav1234

219

Bunu buldum:

git push rorg 'refs/remotes/korg/*:refs/heads/*'

Ve tüm uzak dallarımı korg'dan rorg'a itti (şubelerin yerel kopyaları olmasa bile). Aşağıdaki çıktıya bakın:

Counting objects: 293, done.
Delta compression using up to 4 threads.
Compressing objects: 100% (67/67), done.
Writing objects: 100% (176/176), 48.32 KiB, done.
Total 176 (delta 105), reused 168 (delta 97)
remote: Resolving deltas:  11% (12/105)
To <<MY_REPOSITORY_URL>>
 * [new branch]      korg/gingerbread-> gingerbread
 * [new branch]      korg/gingerbread-release -> gingerbread-release
 * [new branch]      korg/honeycomb-> honeycomb
 * [new branch]      korg/HEAD -> HEAD
 * [new branch]      korg/honeycomb-mr1-release-> honeycomb-mr1-release
 * [new branch]      korg/master -> master

Ve sonra, tagsreferanslar için aynı zorlamayı yapabilirsiniz :

git push rorg 'refs/tags/*:refs/tags/*'

2
Git'in yeterince yeni (hangi sürümü?) Kabul edilen cevap bu olmalıdır. @ bjarke-freund-hansen Gelecekte arama yapanların yararına kabul ediyorsanız, kabul edilen cevabı değiştirmek ister misiniz?
Jonah Graham

1
Git'in "yeterince yeni (hangi sürümü?), Kabul edilen cevap bu olmalı" bildiğim gibi, bu her genel git sürümü için işe
yaramalı

3
Everything up-to-dateTek tek şubeler için aynı şeyi yaparken bana 2.10.0 sürümünde hiçbir şey olmamasını veriyor .
user239558

6
Sadece şunu söylemem gerektiğini düşündüm: bu yöntem, çağrılan uzaktan kumanda üzerinde gerçek bir dal oluşturuyor gibi görünüyor HEAD. Ancak bu silinebilir. git push rorg :HEAD
Mark Stickley

1
Ref yapısı ve nasıl etiket aktarılacağını merak aşina olmayan herkes, bu komutu istiyorum: git push rorg refs/tags/*:refs/tags/*. Bu ile aynı git push rorg --tags, ancak bu şeylerin ne yaptığını anlamak güzel :)
Mark Stickley

14

Patthoyt'un cevabını tamamlamak için , işte tüm dalları bir uzaktan kumandadan diğerine iten kısa bir kabuk betiği:

SRC_REMOTE=korg
DST_REMOTE=rorg
for a in $(git branch --list --remote "$SRC_REMOTE/*" | grep -v --regexp='->')
  do git push "$DST_REMOTE" "$a:refs/heads/${a//$SRC_REMOTE\/}"
done

Özetlemek gerekirse, uzak kaynaktaki her bir uzak dal için (HEAD gibi "işaretçi" dalları hariç), o ref'i uzak hedefe itin. ( ${a//$SRC_REMOTE\/}Bit, kaynak uzak adını dal adından çıkarır, yani origin/masterolur master.)


3
tek seferde yapması gerekenler için:git push -u $DST_REMOTE $(for a in $(git branch --list --remote "$SRC_REMOTE/*" | grep -v --regexp='->'); do echo "$a:refs/heads/${a//$SRC_REMOTE\/}"; done)
Jayen


0

Çalıştırmanızı önerdiğim herhangi bir komut dosyası için, tüm değişikliklerinizi saklamak veya uygulamak akıllıca olacaktır.

Birkaç dalı bir uzaktan kumandadan diğerine itmem gerekiyordu. Bu cevaplar, yerel şubelerin daha önce var olmasını gerektirdi

SRC_R=origin1
DEST_R=origin2
for cbranch in $(git branch -r | grep $SRC_R | cut -d '/' -f2,3,4,5 | cut -d ' ' -f1)
do
    git checkout $cbranch
    git push $DEST_R $cbranch
done

Sadece origin1'i uzak kaynak ve origin2'yi hedef uzak olarak değiştirin. Bunu "remoteBranchCloner.sh" içine kopyalayın ve "sh callBranchCloner.sh" kullanarak çağırın.

Birkaç itme yapmayan daha iyi bir yol olabilir .

Kodumu kullanırsanız, muhtemelen kimlik bilgilerini önbelleğe almayı kullanmak istersiniz , aksi takdirde kimlik bilgilerinizi birkaç kez yazmanız gerekir.

Windows için :

Not: Bu script linux içindir . Eğer "git bash" içinde çalıştırırsanız , betik çalışacaktır, ancak özel bir şey yüklemeden onu yerel konsoldan çalıştıramazsınız.

git config [--global] credential.helper wincred

Linux için

git config [--global] credential.helper cache

Burada [--global] isteğe bağlı olarak --global ekle anlamına gelir

Tüm şubeler için uzaktan izlemeyi yeni bir uzaktan kumandaya ayarlamak isterseniz:

DEST_R=remotename
for cbranch in `git branch`
do
    git checkout $cbranch
    git branch -u guru/$cbranch
done

Bir .sh dosyası olarak saklanan ve "sh dosyaadı.sh" ile çalıştırılan tüm yukarı akışları uzak "uzak" adı "izleyecek şekilde ayarlar


0

HEADÖnceki cevapta yaratılan fazladan dal nedeniyle , bunu yapmanın en temiz yolu, çıplak bir depoya klonlamak ve ardından tüm dalları aşağıdaki gibi uzaktan kumandaya itmektir:

git clone --bare <from-repository>
cd <from-repo-dir>
git push --set-upstream <to-repository> --all
git push --set-upstream <to-repository> --tags
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.