2012-10-13 4 views
11

Yaptığım şey oldukça basit olmalı, ancak nasıl çalıştığını anlayamıyorum.Git revizyon numarasını dağıtım sırasında dosyalara ekle

İki nedenle, html ve javascript dosyalarına benzersiz bir sürüm numarası gömmek istiyorum. Birinci nedeni javascript dosyası yüklendiğinde yeni bir sürümü varsa, sistem önbelleği kullanmak denemez emin olmak istiyorum, ama

<script src="/app.js?v1.0.1-1-95425234"></script> 

gibi bir şey kullanarak diyebiliriz eğer Bunun asla gerçekleşmeyeceğinden kesinlikle emin olabilirdim. İkinci sebep ise uzaktaki hata kayıtlarımdır. Sistemin hangi sürümünün hatalar içerdiğini bilmek iyi olur, bu yüzden uygun bir şekilde düzeltmek için bakabilirim, ancak her sürümde bu sürüm numarasını manuel olarak güncellemeye gerek kalmadan.

Yol boyunca git describe'a rastladım ve bunun çıkış değerinin bunun için çok uygun olacağını düşünüyorum.

Temelde ben GIT-CURRENT-VERSION gibi benim javascript ve html dosyalarına bir anahtarı alıp benim dağıtım yöntemi için kumaş kullanıyorum git describe

çıkışında ile değiştirmek istiyorum, bu yüzden bu kadar anlamlı bir sürü yapacak sunucu tarafında yapmak, git son sürümü yakaladıktan sonra.

sed ve grep'un bazı birleşimlerinden şüphelenirim ve bu konuda tek bir liner bulabilirsem, dağıtım komut dosyasına eklemek çok kolay olurdu.

Şimdiden teşekkürler!

+0

Hangi web çerçevesini kullanıyorsunuz? Sanırım "GIT-CURRENT-VERSION" un tekrarlı değiştirilmesi gibi daha iyi çözümler var. – guettli

+0

guettli - Son kullanmadığım şeyi gönderdim. Umarım yardımcı olur! –

cevap

5

Sen dağıtılan git ağacının kökünden aşağıdaki gibi bir şey yapabileceğini:

export VERSION="$(git describe)" 
find . -type f -print0 | xargs -0 sed -i "s/GIT-CURRENT-VERSION/$VERSION/g" 

(Yani üstünkörü test vardı sadece var - dikkatli bir şekilde kullanın.) Bu ağaç bırakacağını

Not yerel değişikliklerle.

9

fabric'u hiç duymadım, ancak eğer kumaş git archive kullanıyorsa, gitattributes'u kullanabilirsiniz. depo üstündeki

<script src="/app.js?$Format:%H$"></script> 

Ve .gitattributes yılında: Yani böyle bir şey ile HTML dosyaları olabilir olabilir, size git-archive bir arşiv oluşturmak zaman Sonra

*.html export-subst 

, $Format:%H$ olacak taahhüdün karma yerine geçer. git-log'da --pretty-format ile mevcut olan her şeyi kullanabilirsiniz.

Kontrol gitattributes veya daha iyi manuel: Bölüm "8.2 Customizing Git - Git Attributes" Pro Git kitabın fazla fikir almak için.

1

Guettli'nin yorumuyla, sahip olduğum son sonucu yayınladığımı düşündüm. İşte çözümüm, Mark Longair'in çözümüne dayanıyor.

export DESCRIPTION="$(git describe)" 
find [PATH] -regextype posix-extended -regex ".*\.(js|html)" -type f -print0 | xargs -0 sed -i "s/CURRENT-GIT-DESCRIPTION/$DESCRIPTION/g" 

Burada yaptığım şey hakkında biraz bilgi vereceğim.

export DESCRIPTION="$(git describe)" Git deposunun geçerli durumunun geçerli açıklamasını alır. Daha fazla bilgi için, git describe Manual Page'a bakın.

Sonraki, find [PATH] -regextype posix-extended -regex ".*\.(js|html)" -type f -print0[PATH] ile deponuzun yolunu değiştirebilirsiniz. -regextype posix-extended -regex ".*\.(js|html)", dizinler arasında iner ve ".*\.(js|html)" tarafından tanımlanan regex ile eşleşen tüm dosyaları bulur. Benim durumumda, sadece değiştirmelerin javascript veya html dosyalarında olmasını istediğimi biliyorum. Son olarak xargs -0 sed -i "s/CURRENT-GIT-DESCRIPTION/$DESCRIPTION/g", sisteme CURRENT-GIT-DESCRIPTION'u yukarıdaki git describe tarafından tanımlanan değerle değiştirmesini söyler.

Benim durumumda, sunucuya dağıtmak için fabric kullanıyorum ve değişikliklerin gerçek zamanlı olarak gerçekleşmesini istediğim için bu oldukça iyi çalışıyor, ne yaptığımı depoyu güncelleştirip sonra da sistemin yeni dağıtımı. Sistem gitmeye hazır olduğunda, git veri dosyalarından kurtulup, bunu sadece normal bir veri yapısı olarak bırakıyorum. Şimdi sisteme yeni yapıyı kullanmasını söyleyebilirim ve her şey hazır.

Başkalarına benzer bir şey elde etmek isteyenlere yardımcı olmasını umuyorum!