2013-04-11 15 views
5

İki çatallı olduğu için, birbirinin çatalları olan ve zaman zaman birbirinden bir diğerine gönderim yapmam gerekiyor. ÖrneğinGit yamaları yalnızca belirli dosyaları değiştiren işlemler için nasıl oluşturabilirim/uygulayabilirim

:

git-repo1 bu dizin aşağıdaki yapıya sahiptir:

repo1/project1/src

repo1/project2/src

git-repo2 ise aşağıdaki dizin yapıya sahiptir:

repo2/src/

Yapmak istediklerim, yalnızca belirli bir alt dizindeki (örneğin, repo1/project1/src) dosyaları değiştiren ve yalnızca başka herhangi bir yerde dosyaları değiştiren tüm işlemleri yok sayan işlemler için bir dizi işlem yapıp yamalar oluşturmaktır. Ya da alternatif olarak, tüm işlemler için yamalar oluşturun, ancak yalnızca belirli bir dizindeki dosyaları değiştirirse yamayı uygulayın.

İşlemlerle ilgili meta verileri korumam gerekiyor, bu nedenle git diff ile oynamak, geçerli bir seçenek gibi görünmüyor.

Çatallı git reposları arasındaki dizin yapısı farklıdır.

Bunu yapmak için ileriye doğru bir yol var mı?

UPDATE1

Ben dizin yapıları farklı başa çıkma açısından bu soruyu (How to apply a git patch from one repository to another?) görüyoruz.

Peki ya yama, yalnızca mevcut olmayan dosyaları değiştirmekten bahsediyorsa? Bu tür değişiklikleri görmezden gelmek isterim. İki depoları (ikisi de aynı deposundan çatallı, ancak farklı şekilde evrimleşmiş) ortak bir tarih varsa

cevap

9

git rev-list --reverseseries-- repo1/project1/src/ \
| xargs [email protected] git format-patch --stdout @^! >mystuff.patch

etkileyen serisi yılında kaydedilmesini tükürmek edeceği alt dizin Sonra mystuff.patch

, içine

cat >mystuff.sed <<\EOD 
/^(From [0-9a-f]{40}|diff --git)/!{H;$!d} 
x 
/^From /b 
${h;s,.*--,--,;x} 
\,^diff[^\n]* [ab]/repo1/project1/src/,!{$!d;x;b} 
${p;x} 
EOD 

ve

sed -Ef mystuff.sed mystuff.patch >justmystuff.patch 

, bu dizinin dışındaki tüm hunileri çıkartacak. İstenilen gibi -pn ve --directory=new/path/to ile

git am justmystuff.patch 

ile başvurabilirler.

(düzenleme: PMİ -> \ EOD nedenle yukarıdaki kedi yerine çalışmaz)

+0

komutunu kullanırken "sed-rf mystuff.sed mystuff.patch> justmystuff.patch" Im hatası "sed: yasadışı seçeneği - r" alma? ne olabilir bir fikrin var –

+0

Kullanım '- E 'yerine,' -r' artık tarihsel bir yazımdır.Tüm cevapta sabit, teşekkürler – jthill

+1

Eğer sed scriptinizde bir açıklama yapabilirseniz güzel olurdu! – Neil

1

, bir daldan diğerine seçici taahhüt ithal etmek cherry-picking kullanabilirsiniz.

dokunmak repositoryA içinde kaydedilmesini bulmak iki uzaktan kumanda (sizin iki ıraksak depoları)

ile yerel depo oluşturmak belirli dosyaları

$ git checkout repoA/master 
$ git log sub/dir/ectory 
a34256f ... 

repositoryB

dalı içine bu teslimleri kiraz almak
git checkout repoB/master 
git cherry-pick a34256f 
+0

Hayır, ne yazık ki bir geçmişi paylaşmıyoruz. :( – EMiller