2010-07-28 20 views
5

Orijinal olarak Subversion'dan içe aktarılmış bir Git depomum var. Yazarın/gönderenin bilgilerinin bölümleri yanlıştır; bu, Git'in hatası değildir, ancak çoğunlukla Subversion ile yapılan sıkı çalışmalardan kaynaklanmaktadır.Yazarları/işleyicileri yeniden yazmak ve iletileri aynı anda iletmek için git filtre-dalını kullanma

Depo geçmişini yeniden yazmak, paylaşımcı ve yazar bilgilerini düzeltmek için git filter-branch kullanmak istiyorum.

Sorun şu ki ... iletilerinin iletisinden dışarı çıkması gerekiyor. Anlayabildiğim kadarıyla, , yazar bilgilerini (--env-filter ile) filtrelemeyi ve değiştirmeyi ve/veya taahhüt mesajlarını filtrelemeyi (--msg-filter ile), ancak 'un aynı anda farklı filtreler arasında paylaşılacak bilgileri eş zamanlı olarak yapmanızı sağlar. .

Bu şekilde nasıl yapılacağına dair çok şaşırdım ... düşünebildiğim en iyi şey birden fazla geçişte yapmaktır: önce, tüm taahhüt mesajlarını toplayın, daha sonra içinden gitmesi ve filtrelenmesi için bir komut dosyası hazırlayın tüm yazar/komiser bilgisi. Bu oldukça temkinli ve hataya eğilimli görünüyor, bu yüzden başka birinin bu tür bir işi daha sorunsuz yapıp yapamayacağını merak ediyorum.

cevap

4

Tek geçişte yapabilmeyi düşünebildiğim tek şey bir taahhüt filtresi kullanmaktır. Mesaj filtresi gibi, stdin üzerinde günlük mesajını alır, böylece onu ayrıştırıp neye ihtiyacınız olduğunu öğrenebilirsiniz. Daha sonra uygun değişkenleri kendiniz ayarlayabilir ve git commit-tree'u kendiniz arayabilirsiniz. (Işlemek filtre esasen açılan yerine işlemek ağacı için aynı argümanları alıp aynı çıktıyı üreten içindir.) Bash ise

, böyle bir şey olurdu:

message=$(read_from_stdin) 

modify_env_vars "$message" 

echo "$message" | git commit-tree "[email protected]" 

ben Bunu hiç denemedim, ama neden bu iki kabuk işlevini düzgün bir şekilde yazdığınızı varsayarak neden işe yaramayacağını göremiyorum!

(Ve sadece küçük bir notu - o hep bu sırayla çalıştırmak ediyoruz işte, --env-filter ve --msg-filter birbirini etkilemeyen, o kadar çok değil Yani, ilk filtre dosyalarında yan etkileri geride bırakabilir. ya da diğer görmek için çevre, ama onlar ne istediğinizi yapmaya devam eden bir düzen içinde.)

+0

Teşekkürler, Jefromi, Ben bunu bir şans vereceğim! Ayrıca, --env-filter ve --msg-filter'inin siparişi hakkında iyi bir nokta: Önerdiğiniz gibi temp dosyalarını geride bırakmayı düşünmüştüm, ama istediğim sıraya göre çalışmayacağını fark ettim. –

İlgili konular