2010-09-08 16 views
10

Güncelleme: Seçeneklerimin açık bir açıklamasını almak için gerçek örneği burada basitleştirmeyi denedim, ancak bu gerçekten işe yaramadı. Aşağıdaki basit örnekler, bu basit örnek çalışmayı bile elde etmek için çok genel.Git'ten bir tarih alt kümesi nasıl çıkarılır?

Her zaman SVN ile böyle bir şey yapabildim ve bu konuda oldukça yetenekli oldum. Şimdi onu Git'te çok zor buluyorum ve tarihimin temel olarak birbirinden kopup parçalanabileceğine inanmaya başlıyorum.

Gerçek dünya sorunu: Taşınan ve yeniden adlandırılan bir düzine dosya var. Tarihleri, tarihi tamamen kaldırmak istediğim yüzlerce dosyanın geçmişi ile karışır.

SVN'de, deponun kesilmesini sağlamak için bir dizi dökümü/içerme filtresi/exclude-filter/load dizisini kullanabileceğim ve nadiren yükleme işleminden önce çöplerin kendisinde el ile yolların yeniden adlandırılması gerekebilir. Böyle

şey ve ben bitmiş olurdu:

SET Includes=trunk/src/Foo.aaa trunk/src/Foo.bbb trunk/src/Foo trunk/src/Bar 
SET Excludes=trunk/src/Bar/Blah.aaa trunk/src/Foo/Blah.aaa 

svnadmin dump FooSrc > Full.dump 2> Dump.log 
svndumpfilter include %Includes% --skip-missing-merge-sources --renumber-revs --drop-empty-revs <Full.dump> Filter_1.dump 2> Filter_1.log 
svndumpfilter exclude %Excludes% --skip-missing-merge-sources --renumber-revs --drop-empty-revs <Filter_1.dump> Filter_2.dump 2> Filter_2.log 
svnadmin create FooDest 
svnadmin load FooDest --ignore-uuid <Filter_2.dump> Load.log 2> Load_Errors.log 

kimse tek alt dizinin tek bir dosya ya da ihracat sadece önemsiz bir kaldırma fazla olması bunun iyi bir örneği var mı?

Dosya kümesini tanımlayabilmenin en basit yolu 7 dizin yolu listesidir. Bu dizinlerin içindeki her şeyin tutulması ve dışarıdaki her şeyin tarihin budanması gerekiyor.


Basitleştirilmiş sorun:

Ben kendi depoya ayıklamak istediğiniz dosyaların bir avuç olan bir Git depo var. Sorun, bu dosyaların orijinal havuzun tarihi boyunca oluşturulduğu ve değiştirildiği için, bunları nasıl temizleyeceğimizi bulmakta zorlanıyorum.

Geçmişimin neye benzediğinin bir özüdür (yalnızca daha fazla taahhüt ve göz ardı edilmesi gereken çok şey). Eğer Açıkçası sonradan bu dosyaları var olmak planı yoktu görebileceğiniz gibi kiraz tarihinin dışarı aldı:

commit 4a09d3f977a8595d9e3f61766a5fd743e4265a56 

M src/Foo/Bar/FileToExtract2.foo 
A src/Foo/Bar/FileToExtract3.bar 
D src/Foo/AnotherFileToIgnore.txt 

commit 05d26f23518083270cc45bf037ced29bec45e064 

M src/Foo/Blah/IgnoreThisOneToo.foo 
M src/Foo/AnotherFileToIgnore.txt 

commit 343187228f4bd8e4427395453034c34ebd9a95f3 

M src/Foo/Bar/FileToExtract1.txt 
M src/Foo/AnotherFileToIgnore.txt 

commit 46a0129104ac31291462f657292aab43f8883d8d 

A src/Foo/Bar/FileToExtract1.txt 
A src/Foo/Bar/FileToExtract2.foo 
M src/Foo/FileToIgnore.txt 

commit 3fe6af56f0d8dc42fcb5b0bafee41bff534ba2cc 

A src/ReadMe.txt 
A src/IgnoreMe.foo 
A src/Foo/FileToIgnore.txt 
A src/Foo/Blah/IgnoreThisOneToo.foo 
A src/Foo/AnotherFileToIgnore.txt 

Sonunda, ne olmasını istiyorsanız arasında tam geçmişi olan temiz bir havuzdur sadece src/Foo/Bar/'daki dosyalar. Gerisi göz ardı edilebilir. Ben de bu depoyu olduğu gibi tutuyorum (yani tarih yazmıyor) ve bu dizinin tamamı için bir silme işlemini tamamladım.

SVN'de svnadmin dump, svndumpfilter ve svnadmin load kullanır. Dikkatli olsaydım, yolları temizlemek için çöp kutusunu elle bile düzenleyebilirim.

Git komutlarını inceledim ve bunu yapmanın bir yolunu göremiyorum. Herhangi bir yardım büyük takdir edilecektir.

cevap

7

git filter-branch'u kullanabilir ve Foo dizinini kendi dizininden çıkarabilirsiniz.
Bkz:

+0

Mükemmel. Bence tam da aradığım şey bu. Bu gece deneyeceğim. Teşekkürler! – mckamey

+0

İhtiyacım olan şey bu gibi görünüyor, ancak yeni budanmış depoda birden fazla alt dizini eklemek istersem ne olur? 'Git filtre-şubesi --subdirectory-filtre 'yalnızca bir değer alıyor? – mckamey

+0

@McKAMEY: http://stackoverflow.com/questions/1425892/how-do-you-merge-two-git-repositories iyi bir başlangıç: alt modüller veya alt ağaç birleştirme. – VonC

3

svn'nin svnadmin dump, svndumpfilter ve svnadmin load olacağını git fast-export, bir kendi script eşdeğer (examples bakınız) ve git fast-import.

+0

@VonC: Bağlantı sağladığınız için teşekkür ederiz. –

+0

Ben çıkarmak için gereken dosyaların listesini içeren 7 dizin var. Bu 7 dizinin dışındaki her şeyi filtrelemek için dışa aktarma ve içe aktarma arasında ne belirtmeliyim? 'Svndumpfilter include' eşdeğerine ihtiyacım var. – mckamey

+0

"Örneklere bakın" bağlantısı, filtre komut dosyası için yalnızca bir "sed" s | refs/heads/master | refs/heads/other | "' örneği sağlar. Git'e, 7 alt dizinimden biri olarak mevcut olmayan tüm dosyaları kaldırmasını söylemeye nasıl giderim? – mckamey

İlgili konular