Tüm şubeleri ve etiketleri içeren yerel Git repo'yu yeni uzaktan kumandaya aktarın


551

Yeni bir uzaktan repo (Beanstalk üzerine kurulmuş yeni bir repo)
Yerel depomun birkaç şubesi ve etiketi var ve tüm geçmişimi saklamak istiyorum.

Temelde sadece bir yapmam gerekiyor gibi görünüyor git push, ama bu sadece masterdalı yükler .

Uzaktan kumandadaki yerel depomun tam bir kopyasını almak için her şeyi nasıl zorlarım?


En kısa ve en kolay cevap - stackoverflow.com/a/39992258/6648326 .
MasterJoe2

Yanıtlar:


898

Tüm dallarınızı itmek için şunlardan birini kullanın (UZAKTAN uzaktan kumandanın adıyla değiştirin, örneğin "orijin"):

git push REMOTE '*:*'
git push REMOTE --all

İtmek için tüm etiketler :

git push REMOTE --tags

Son olarak, tüm bunları tek bir komutla yapabileceğinizi düşünüyorum:

git push REMOTE --mirror

Ancak, ek olarak --mirror, uzaktan kumandalarınızı da itecektir, bu yüzden tam olarak istediğiniz şey olmayabilir.


53
--allyerine *:*daha samimi görünüyor
Idan K

56
tanrım ............. i tüm internet yırttı ve ben gerekli --All` anahtarı AAAAALLLLLLLLLLLLLL olduğunu öğrendim!
Rakib

21
Sadece hiçbir şey yapmadan git push REMOTE --allgeri döndüğüne dikkat No refs in common and none specified;çekerken git push REMOTE "*:*.
Im0rtality

10
UZAKTAN gerçekten güncellemek istemediğiniz yerel olarak "tmp" veya "özellik" şubeleriniz olması durumunda ne olacağını incelemek için --dry-run komutunu kullanın
Jonno

55
Orijinal uzaktan kumanda hala mevcutsa, yapmak güzel bir fikirdir git clone --mirror old-remote-url; cd repo.git; git push --mirror new-remote-url.
Suzanne Dupéron

157

Benim gibi bir repo kazandınız ve şimdi uzak kökeni farklı bir repoya, yeni bir boş repoya dönüştürdüğünüz durumda ...

Bu yüzden repo ve içerideki tüm şubeler var, ama yine de bu şubeler için git push --all .

Bunu itmeden önce yapmalısınız:

for remote in `git branch -r | grep -v master `; do git checkout --track $remote ; done

Bunu takiben

git push --all

4
Tüm dalları manuel olarak kontrol etmek zorunda kaldım, bu da gerçekten yararlı. Bu bir dahaki sefere iyi olacak.
Cory Imdieke

10
Garip bir şekilde, git push '*:*'tüm dalları itti. git push -allsadece efendiyi itti. Repoyu github'dan bitbucket'e taşıyordum.
jerrymouse

3
Her şubeyi kontrol etmek yerine sadece "git branch --track $ remote" yapmalısınız. Eski bir şubeyi kontrol eden büyük depolarda ara sıra
Moataz Elmasry

2
Bunun çalışması için küçük bir değişiklik yapmak zorunda kaldım: --track remotes/$remotebunun yerine --track $remote. Komple komut satırı:for remote in `git branch -r | grep -v master `; do git checkout --track remotes/$remote ; done
Adrian T

Teşekkürler, benim için çalışıyor, yukarıdaki cevap da işe yaramıyor.
Benyamin Jafari

90

İşte oldu durum için iyi çalıştı aynı şey başka almaktır. Uzaktan bütün kolları klonlamak istiyorum, daha uzakta olandan sahip sorunu çözer sourceuzaktan içindestination ancak önceden hepsini kontrol etmek zorunda kalmadan.

(Daniel'in çözümü ile ilgili sorunum, sourcedaha önce kontrol etmiş olsaydım , uzaktan bir izleme şubesini kontrol etmeyi reddetmesiydi , yani, itmeden önce yerel şubemi güncellemeyecekti)

git push destination +refs/remotes/source/*:refs/heads/*

Not: Doğrudan CLI kullanmıyorsanız, yıldız işaretlerinden kaçmanız gerekir:

git push destination +refs/remotes/source/\*:refs/heads/\*

bu, uzaktaki tüm dalları içeriye sourcedoğru bir kafa dalına iter destination, muhtemelen hızlı bir şekilde ileri doğru itme yapmaz. Etiketleri yine de ayrı ayrı itmeniz gerekir.


8
+1 Bu benim için çalıştı, birinden remotediğerine klonlama . Teşekkürler!
Laurence

4
Yıldızlardan kaçmak zorunda kaldım:git push destination +refs/remotes/source/\*:refs/heads/\*
mattalxndr

2
Benim için, bu senaryoda kasıtlı olduğunu düşünmediğim HEAD adlı bir kolu itti.
maxwellb

1
Bu cevap benim için inanılmaz faydalı oldu. Bu yıldız işareti kullanımının git-push (1) kılavuz sayfasındaki tek söz, --pruneseçenek için küçük bir örnektir .
laindir

4
Mükemmel cevap, --mirrorherkesin önerdiği normal parametreden çok farklı . Otomasyon veya denetim amacıyla senkronize edilmiş iki uzaktan kumanda tutmak istediğiniz senaryolar için mükemmel çalışır.
Vinicius Xavier

15

Hedef boş olması şartıyla bulduğum en kısa yol budur. Boş bir klasöre geçin ve ardından:

# Note the period for cwd >>>>>>>>>>>>>>>>>>>>>>>> v
git clone --bare https://your-source-repo/repo.git .
git push --mirror https://your-destination-repo/repo.git

Değiştirin https://...için file:///your/repouygun olarak alır.


13

İçin manpage git-pushokunmaya değer. Bu web sitesi ile birlikte aşağıdakileri yazdım .git/config:

[remote "origin"]
    url = …
    fetch = …
    push = :
    push = refs/tags/*

push = :Aracı olurken, "herhangi bir 'eşleştirme' dalları itin (zaten uzak Depoda yani dalları ve yerel bir meslektaşı var)"push = refs/tags/* anlamına gelir "tüm etiketler".

Şimdi sadece koşmam gerek git push eşleşen tüm dalları ve tüm etiketleri itmek .

Evet, OP'nin istediği tam olarak bu değil (itmek için tüm şubeler uzak tarafta zaten var olmalıdır), ancak bu soruyu bulanlar için "dalları ve etiketleri aynı anda nasıl iterim?" zaman".


13

Benim durumumda işe yarayan şeydi.

git push origin --all

4
Basit ve kolay. İşe yarıyor! origin, uzak URL Git deposu için takma addır.
Nhu Vy

8

Bir havuzu yansıtma

Deponun çıplak bir klonunu oluşturun.

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

Yeni veri havuzuna ayna itin.

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

1. adımda oluşturduğunuz geçici yerel havuzu kaldırın.

cd ..
rm -rf old-repository.git

Git Büyük Dosya Depolama nesneleri içeren bir havuzu yansıtma

Deponun çıplak bir klonunu oluşturun. Örnek kullanıcı adını, havuzun sahibi olan kişinin veya kuruluşun adıyla değiştirin ve örnek havuz adını, çoğaltmak istediğiniz deponun adıyla değiştirin.

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

Yeni klonladığınız depoya gidin.

cd old-repository.git

Deponun Git Büyük Dosya Depolama nesnelerini çekin.

git lfs fetch --all

Yeni veri havuzuna ayna itin.

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

Deponun Git Büyük Dosya Depolama nesnelerini aynaya doğru itin.

git lfs push --all https://github.com/exampleuser/new-repository.git

1. adımda oluşturduğunuz geçici yerel havuzu kaldırın.

cd ..
rm -rf old-repository.git

Yukarıdaki talimatlar Github Yardım'dan gelir: https://help.github.com/articles/duplicating-a-repository/


1
Bu teorik olarak soruyu cevaplayabilse de , cevabın temel kısımlarını buraya dahil etmek ve referans için bağlantı sağlamak tercih edilir. Daha iyi "bağlantı tabanlı" yanıtların nasıl yazılacağı ile ilgili talimatlar için buraya bakın . Teşekkürler!
GhostCat

5

Yukarıdaki yanıtların hala kullanıcıları yanlış yönlendirecek bazı belirsiz şeyleri olduğunu buldum. İlk olarak, Kesinlikle olduğunu git push new_origin --allvegit push new_origin --mirror menşe tüm dallarını yinelenen olamaz, sadece senin new_origin için yerel var dalları çoğaltmak.

Aşağıda test ettiğim iki yararlı yöntem var:

1, klon çıplak repo ile çoğaltın. git clone --bare origin_url, sonra klasörü girin ve git push new_origin_url --mirror.Bu şekilde git clone --mirror origin_url, her ikisini de kullanabilirsiniz --bareve --mirrorçalışma alanı dahil değil, çıplak bir repo indirirsiniz. bakınız bu

2, kullanarak bir git repo varsa git clone, yani çıplak repo ve git çalışma alanınız varsa, kullanabilirsiniz git remote add new_origin new_origin_url, ve sonra git push new_origin +refs/remotes/origin/\*:refs/heads/\*ve sonragit push new_origin --tags

Bu şekilde, mantıklı olmayan ekstra bir kafa dalı elde edersiniz.


2

Dalları ve etiketleri itmek (ancak uzaktan kumandaları değil):

git push origin 'refs/tags/*' 'refs/heads/*'

Bu , git'in izin vermediği --tagsve --allseçeneklerini birleştirmekle eşdeğerdir git push.


Başka bir uzaktan kumandadan itmek için ek bir seçenek var mı? Mesela+refs/remotes/source/*
Yves Martin ile

2

Merkezli @Daniel yaptım cevap:

for remote in \`git branch | grep -v master\`
do 
    git push -u origin $remote
done

2
Daha da iyisi, | grep -v masterdeğiştirilebilir | sed 's/\*//'(Ben hariç assuming masterpis küçük önlemek için *eklemek verir seçili şube başına ilave oluyor) masterne zaman ve herhangi bir sorun önlemek masteriçin seçili dalı değildir. Ayrıca nekropostlama için üzgünüm, bu cevap bugün bana yardımcı oldu ve pozisyonumdaki diğerlerine yardımcı olabilirse modifikasyonumu paylaşmak istedim ...
ToVine

1

Bunların hiçbirinin benim için düzgün çalışmadığını gördüm. Bunu ölümüne alevlendirmekten çekinmeyin, ancak bir nedenden ötürü diğer seçeneklerin düzgün çalışamaması.

Beklenen sonuç, başka bir uzaktan kumandaya (yani Github'dan başka bir sağlayıcıya) "kopyalanan" bir repo idi:

  • Tüm şubeler yeni uzaktan kumandada oluşturulur
  • Tüm şube geçmişi yeni uzaktan kumandada oluşturulur
    • (bu, denediğim her çözümde kaçırıldı)
  • Tüm etiketler yeni uzaktan kumandada oluşturulur
  • Kaynak taşınıyor (belirli)
  • Tahribatsız (--mirror seçeneğine duraklama vermek)

Gördüğüm en önemli sorun, tüm uzak dalların yeni uzaktan kumandayla yeniden yaratılmamasıydı. Bir komut verdiyse, yeni uzaktan kumandanın dal geçmişi yoktu (örn.git checkout branch; git log , beklenen dal taahhütlerini göstermezdi).

Ben fark git checkout -b branchnameaynı git checkout branchname(ikincisi ne gerekli olduğunu). farkettimgit checkout --track branchnameŞube geçmişini çekmediğini .

Benim Çözüm (powershell bazlı):

Function Git-FetchRemoteBranches {
$originalbranch = (git symbolic-ref HEAD).split("/")[-1]

Foreach ($entry in (git branch -r)) {

If ($entry -like "*->*") {
  $branch = $entry.split("->")[2].split("/")[1]
}
  else {$branch = $entry.split("/")[1]}

Write-Host "--Trying git checkout " -NoNewline
Write-Host "$branch" -Foreground Yellow

git checkout $branch

Remove-Variable branch -Force

""}

#Switch back to original branch, if needed
If ( ((git symbolic-ref HEAD).split("/")[-1]) -ne $originalbranch) {
"Switching back to original branch"
git checkout $originalbranch
Remove-Variable originalbranch -Force
}
}

git clone http://remoterepo
cd remoterepo
Git-FetchRemoteBranches
git remote add newremote
git push newremote --all
git push newremote --tags #Not sure if neeeded, but added for good measure

1

Aşağıdaki komut tüm dalları itecektir ( daha önce teslim almadığınız, ancak git deponuzda mevcut olanlar da dahil olmak üzeregit branch -a )

git push origin '*:*'

NOT: (sürüm kontrol hizmeti göç edildiğinde Bu komut kullanışlı geliyor geçiş yani Gitlab için GitHub'dan )


1
Sürüm kontrol hizmetleri arasında geçiş ve tam olarak aradığım şey, şerefe!
Luka Špoljarić

1

Bir sürüm kontrol hizmetinden diğerine geçme sürecindeydim ve tüm dallar, etiketler ve geçmiş dahil tüm depoları klonlamak gerekiyordu.

Yukarıda başarmak için bir sonraki yaptım:

  • tüm şubeleri manuel olarak yerel depoya teslim etme (aşağıda gösterilen tüm ödeme için komut dosyası),
  • git push origin '*:*'

.sh komut dosyası yerel depodaki tüm şubeleri kullanıma almak için kullanılır:

for branch in `git branch -a | grep remotes | grep -v HEAD | grep -v master `; do
   git branch --track ${branch#remotes/origin/} $branch
done
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.