Git veri havuzu içeriğini başka bir veri havuzu koruma geçmişine taşıma


141

Aşağıdaki komutları kullanarak yalnızca bir depo ( repo1) içeriğini başka bir varolan depoya ( repo2) taşımaya çalışıyorum :

git clone repo1
git clone repo2
cd repo1
git remote rm origin
git remote add repo1
git push

Ama işe yaramıyor. Benzer bir gönderiyi gözden geçirdim, ancak içeriği taşımak için yalnızca bir tane klasör buldum.


Repo1 içeriğinin repo2'de bir şube olarak mı yoksa master'ın bir parçası olarak olmasını mı istiyorsunuz, böylece her iki deponun klasörleri çalışma dizininizde bir arada var olur mu?
Chronial

Bunu ustanın bir parçası olarak taşımak istiyorum.
Mario

4
Bu eğitim mükemmel! smashingmagazine.com/2014/05/19/…
xpto

Yanıtlar:


243

Bence aradığınız komutlar:

cd repo2
git checkout master
git remote add r1remote **url-of-repo1**
git fetch r1remote
git merge r1remote/master --allow-unrelated-histories
git remote rm r1remote

Bundan sonra ve repo2/mastergelen her şeyi içerecek repo2/masterve her repo1/masterikisinin de tarihine sahip olacak.


Teşekkürler Chronial, ben sadece repo1 de bir dalı olduğundan emin olmak istiyorum ve ben de bu dalı da repo2 taşımak istiyorum?
Mario

Peki, repo2'nin ikinci bir dalı var mı? Ya da o dalda ne olmalı?
Chronial

1
Chronial, yukarıdaki komandolar işe yaramadı! tarihi kopyalamadı.
Mario

1
Tamam, şimdi işe yaradı. Şu komutu kullandım; cd repo2,> git remote rm origin> git remote add origin ekle url-of-repo1 ,> git fetch r1remote> git push origin master
Mario

1
@abhijithda En basit çözüm , birleştirmeyi yapmadan önce repo1içindeki her şeyi bir alt klasöre (içeride repo1) taşımaktır .
Chronial

55

Burada mükemmel açıklanmış https://www.smashingmagazine.com/2014/05/moving-git-repository-new-server/

İlk olarak, mevcut depodaki tüm uzak dalları ve etiketleri yerel dizinimize getirmeliyiz:

git fetch origin

Aşağıdakilerin yerel bir kopyasını oluşturmak için ihtiyaç duyduğumuz eksik dalları kontrol edebiliriz:

git branch -a

Mevcut yerel depomuzda yeni bir uzaktan kumanda oluşturmak için yeni depomuzun SSH klonlanmış URL'sini kullanalım:

git remote add new-origin git@github.com:manakor/manascope.git

Artık tüm yerel şubeleri ve etiketleri yeni kaynaklı yeni uzaktan kumandaya aktarmaya hazırız:

git push --all new-origin 
git push --tags new-origin

Yeni menşei varsayılan uzaktan kumanda yapalım:

git remote rm origin

Yeni orijini sadece orijinal olarak yeniden adlandırın, böylece varsayılan uzaktan kumanda olur:

git remote rename new-origin origin

4
Bunun tüm geçmişi ve etiketleri kopyaladığını onaylayabilir. Çok hoş. Teşekkürler.
Alex

Yeni kökenin herhangi bir taahhüdü yoksa, iyi çalışır. Bununla birlikte, yeni kökende herhangi bir taahhüt varsa, burada belirtilen yol beklendiği gibi söz vermeyecektir.
caot

git checkout BranchNamesonra şubeleri swtich sonra tekrar uzaktan repo şube itmek gerekir git push --all new-origin ama çok teşekkürler
Raad Altaie

21

Mevcut dalları korumak ve tarihçeyi korumak istiyorsanız, işte benim için işe yarayan bir yol var.

git clone --mirror https://github.com/account/repo.git cloned-repo
cd cloned-repo
git push --mirror {URL of new (empty) repo}

# at this point only remote cloned-repo is correct, local has auto-generated repo structure with folders such as "branches" or "refs"
cd ..
rm -rf cloned-repo
git clone {URL of new (empty) repo}
# only now will you see the expected user-generated contents in local cloned-repo folder

# note: all non-master branches are avaialable, but git branch will not show them until you git checkout each of them
# to automatically checkout all remote branches use this loop:
for b in `git branch -r | grep -v -- '->'`; do git branch --track ${b##origin/} $b; done

Şimdi, kaynak ve hedef depoları belirli bir süre senkronize tutmak istediğinizi varsayalım. Örneğin, geçerli uzak depoda yeni / yedek depoya getirmek istediğiniz etkinlik var.

git clone -o old https://github.com/account/repo.git my-repo
cd my-repo
git remote add new {URL of new repo}

En son güncellemeleri almak için (yerel değişiklikleriniz olmadığı varsayılarak):

git checkout {branch(es) of interest}
git pull old
git push --all new

Not: Henüz alt modülleri kullanmadım, bu yüzden eğer varsa hangi ek adımların gerekli olabileceğini bilmiyorum.


1
Bu benim için basit ve kolay çalıştı. Bence kontrol edilen cevap olmalı. 60 şubeniz varsa, işte bu yol.
rickfoosusa

7

Kod Git tarafından zaten izleniyorsa en basit yaklaşım, yeni havuzu, gönderilecek "başlangıç ​​noktanız" olarak ayarlayın.

cd existing-project
git remote set-url origin https://clone-url.git
git push -u origin --all
git push origin --tags

6

Bu benim yerel repo (tarih dahil) benim uzak github.com repo taşımak için çalıştı. GitHub.com'da yeni boş repo oluşturduktan sonra aşağıdaki üçüncü adımda URL'yi kullanıyorum ve harika çalışıyor.

git clone --mirror <url_of_old_repo>
cd <name_of_old_repo>
git remote add new-origin <url_of_new_repo>
git push new-origin --mirror

Bunu şu adreste buldum: https://gist.github.com/niksumeiko/8972566


1
Orijinal depoya izin vermenin en kolay yolu budur. Ayrıca tüm dalları kopyalar.
Guillermo

1
Bu aynı zamanda tüm etiketleri kopyalar.
kuzgun

2

GIT Stash'ımı tüm dalları ve taahhüt geçmişini koruyarak GitLab'a geçirmek için aşağıdaki yöntemi kullandım.

Eski depoyu yerel klonlayın.

git clone --bare <STASH-URL>

GitLab'de boş bir havuz oluşturun.

git push --mirror <GitLab-URL>

1

Yakýn gibisin. Bunun yalnızca gönderiminizdeki bir yazım hatası olmadığını varsayarsak, 3. adım cd repo2repo1 yerine olmalıdır . Ve 6. adım git pullitilmemelidir. Yenilenen liste:

1. git clone repo1
2. git clone repo2
3. cd repo2
4. git remote rm origin
5. git remote add repo1
6. git pull
7. git remote rm repo1
8. git remote add newremote

Teşekkürler Eric, ama 3. adımda herhangi bir uzak değişiklik yapmaktan kaçınmak için orijinal deponun bağlantısını kaldırmak istiyorum .. içerikleri repo1'den repo2'ye taşımak istiyorum.
Mario

Peki. Bunu yansıtmaya çalışmak için cevabımı düzenledim. Sadece emin olmak için, repo1'in bir kopyası olan bir reppoitory, repo2 yapmaya çalışıyorsunuz, ancak repo1 veya orijinini uzaktan kumanda olarak tutmuyor musunuz?
Eric Palace

Hayır, yeni bir repo "repo2" yapmaya çalışmıyorum. Aslında, diğer içeriği init var olan bir repo2 var. Şimdi tüm repo1 içeriğini geçmişi olan repo2'ye taşımak istiyorum. Sunucuda olduğu gibi repo1 boş tutacağım.
Mario

Git kullanmamayı düşündünüz mü? Muhtemelen dosyaları kopyalayabilir (bir gui veya scp veya ftp aracılığıyla) ve bunları git deponuza manuel olarak ekleyebilirsiniz. Bu kadar etkili olmayabilir, ancak muhtemelen daha basittir.
Eric Palace

Zaten denedim ama tarihi bıraktı. Tüm tarihini de taşımak istiyorum.
Mario

1

@ Dan-Cohn cevabına göre Mirror-push burada arkadaşın. Bu, depoları taşımak için gitmemdir:

Bir havuzu yansıtma

1 Git Git Bash'i açın.

2. Deponun çıplak bir klonunu oluşturun.

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

3.Yeni depoya ayna itme.

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

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

$ cd ..
$ rm -rf old-repository.git

Referans ve Kredi: https://help.github.com/en/articles/duplicating-a-repository


-1

Burada birçok karmaşık cevap var; ancak, şube korumasıyla ilgilenmiyorsanız, tek yapmanız gereken uzak menşei sıfırlamak, yukarı akışı ayarlamak ve itmektir.

Bu benim için tüm taahhüt tarihini korumak için çalıştı.

cd <location of local repo.>
git remote set-url origin <url>
git push -u origin master
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.