git: Bir depodaki commit ile yapılan değişiklikleri başka bir depoya uygulayın


115

Yerel makinede bir repo1ve var repo2. Çok benzerler, ancak ikincisi bir tür başka daldır ( repo1artık korunmamaktadır).

/path/to/repo1 $ git log HEAD~5..HEAD~4
<some_sha> Add: Introduce feature X

Nasıl taahhüt tarafından yapılan değişiklikleri uygulamak için <some_sha>de repo1hiç repo2?

Biraz yama hazırlamam gerekiyor cherry-pickmu yoksa depolar arasında biraz yapmak mümkün mü?

Aynı şeyi ancak çeşitli taahhütler için yapmaya ne dersiniz?


2
Repo1'den repo2'ye çekemez misin?
zwol

Yanıtlar:


31

Bir hack olarak, GitTips sayfasındaki iki farklı depodaki taahhütleri karşılaştırmak için tarifi değiştirmeyi deneyebilirsiniz , yani:

GIT_ALTERNATE_OBJECT_DIRECTORIES=../repo/.git/objects \
git cherry-pick $(git --git-dir=../repo/.git rev-parse --verify <commit>)

../repodiğer depoya giden yol nerede .

Modern Git ile çok sayıda revizyonu ve revizyon aralığını kiraz toplama ile kullanabilirsiniz .

$(git --git-dir=../repo/.git rev-parse --verify <commit>) Çevirmek için burada <commit>(örneğin HEAD, ya v0.2, ya master~2taahhüt SHA-1 tanımlayıcı içine kopyalamak ikinci depoda değerlerdir ki,). Seçmek istediğiniz bir değişikliğin SHA-1'ini biliyorsanız, bu gerekli değildir.

NOT o alternatif nesne deposu bir çalışma için, sadece geçici olduğunu bilmez olarak ancak Git kaynak deposunda nesneler kopyalama atlayabilirsiniz söyledi. Aşağıdakilerle ikinci depodaki nesneleri kopyalamanız gerekebilir:

GIT_ALTERNATE_OBJECT_DIRECTORIES=../repo/.git/objects git repack -a -d -f

Bu, ikinci depodan ödünç alınan nesneleri orijinal depo deposuna koyar.

Test edilmedi.


Knittl cevabını takip etmek çok zor olmayan bir çözümdür :

  • Kayıtları kopyalamak istediğiniz ikinci depoya gidin ve istediğiniz kayıtlardan yamalar oluşturun git format-patch
  • İsteğe bağlı olarak, yamaları (0001- * vb.) Deponuza kopyalayın
  • git am --3wayYamaları uygulamak için kullanın

1
İyi çalışıyor. Kaydetme ile ilgili sorun yaşıyorsanız, 'git reset HEAD; git add. '.
gumik

5
bu harika - bir dizi taahhüdü nasıl yapardınız? sadece sha1 ... sha2?
hvgotcodes

Ben de anlıyorum fatal: unable to read tree ...ama git reset HEAD^her şey yolunda gittikten sonra
jmarceli

@hvgotcodes sadece aralığı geçerek benim için çalıştı, <commit>ancak rev-parse --verifykomut sadece tek commit değerlerini kabul ettiği için bundan hoşlanmıyor. Ancak cherry-pickhem tekli hem de aralıklı kesinleştirme değerlerini kabul ettiği için soruyorum: neden rev-parsegerekli?
Chuim

1
@Chuim: git rev-parseBaşka depo, örneğin kendi ref tabanlı adıyla işlemek bir atıfta istiyorsanız gereklidir master, HEAD^^ya böyle bir şey; rev-parse, bunu evrensel SHA-1 tanımlayıcısına dönüştürür.
Jakub Narębski

207

Muhtemelen kullanmak git format-patchve sonra git ambu yamayı deponuza uygulamak istersiniz .

/path/to/1 $ git format-patch sha1^..sha1
/path/to/1 $ cd /path/to/2
/path/to/2 $ git am -3 /path/to/1/0001-…-….patch

Veya tek satırda:

/path/to/2 $ git --git-dir=/path/to/1/.git format-patch --stdout sha1^..sha1 | git am -3

9
Bu çözüm, doğrudan kiraz toplama yöntemini kullanarak kabul edilen yanıttan daha basit ve daha güvenli olduğunu kanıtladı GIT_ALTERNATE_OBJECT_DIRECTORIES(bu, depomu bozardı).
Chuim

2
Çatışma olduğunda, diğer daldaki taahhütleri bulamadığı için işe yaramaz.
Roger Far

2
Ekleme --ignore-whitespaceiçin git amkomuta herhangi çatışmaları çözmek ve 3 yollu birleştirme gerçekleştirmek için gerek önleyebilir
Hugheth

98

cherry-pickİkinci depoyu birinciye (ve sonra fetch) uzaktan kumanda olarak eklerseniz yapabilirsiniz .


11
Aslında bunu yapmanın doğru yolu bu.
Wilbert

5
Bu bana da doğru yol gibi geliyor. Ve sadece kullandım ve benim için iyi çalıştı.
Ricky Nelson

11
Şunu söylemeyi tercih ederim: git fetch [remote-name]ikinci depoda yap ve sonra git cherry-pick [sha1].

5
Bu yaklaşım benim için harika çalıştı, teşekkürler. İkinci depo da yerel olduğundan, uzak olarak eklerken bir dosya URI'si kullanmak zorundaydı.
palimpsestor

2
Benim durumumda, devasa bir uzak git deposunun iki klonuna sahibim (paralel çalışmaya izin vermek için), yani tüm geçmişi zaten HD'mde iki kez indirildi ve depolandı. Ayrıca her birini diğerinin uzaktan kumandası olarak eklemem gerekirse, bu aynı geçmişin fazladan iki kopyasını oluşturacak ve ben yapabilmem için potansiyel olarak aralarında senkronizasyon gerektirecektir cherry-pick. Dolayısıyla "doğru" yol gibi hissettirse de, her zaman en pratik yol değildir.
Chuim

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.