Başka bir havuzdaki bir git havuzuyla nasıl çalışabilirim?


284

Çeşitli projelerde kullanacağım tüm JavaScript ve CSS ana dosyalarımı ve komut dosyalarını sakladığım bir Git medya havuzum var.

Kendi Git deposunda yeni bir proje oluşturursam, medya havuzumdaki JavaScript dosyalarını yeni projemde bunu yapacak şekilde nasıl kullanırım, böylece değişiklik yaptığımda komut dosyasının her iki kopyasını da güncellememe gerek kalmaz ?


Lütfen aşağıdaki rusya-kabalin alt ağaç cevabına bakınız. Not: ön taahhüt (veya aşırı taahhüt ) kancaları, Robert Dundon
Hedgehog

Yanıtlar:


348

Anahtar git alt modülleridir .

Git Topluluk Kitabının veya Kullanım Kılavuzunun Alt Modüller bölümünü okumaya başlayın

Diyelim ki PROJECT1, PROJECT2 ve MEDIA deponuz var ...

cd /path/to/PROJECT1
git submodule add ssh://path.to.repo/MEDIA
git commit -m "Added Media submodule"

Diğer repoda tekrarlayın ...

Şimdi, havalı olan şey, MEDIA'da herhangi bir değişiklik yaptığınızda bunu yapabilirsiniz:

cd /path/to/PROJECT2/MEDIA
git pull
cd ..
git add MEDIA
git commit -m "Upgraded media to version XYZ"

Bu, PROJE2 İÇİNDE MEDYA alt modülünün şimdi XYZ versiyonunda olduğu gerçeğini kaydetti.

Her projenin hangi MEDIA sürümünü kullandığı üzerinde% 100 kontrol sağlar. git submodules harika, ancak bunları denemeniz ve öğrenmeniz gerekiyor.

Büyük güç ile kıçtan ısırmak için büyük bir şans gelir.


Bu iş akışı bana özel bir NPM modülü kullanmanızı hatırlatıyor stackoverflow.com/questions/7575627/…
cyrf

Varsayılanın en son sürüm olmasını tercih ederseniz, MEDIA taahhüdünü tüm bağımlı projelere yaymak için bir komut dosyası ekleyebilirsiniz.
jiggunjer

3
Bu, github ile nasıl entegre olur?
theonlygusti


20

Sorununuzu iyi anlarsam aşağıdakileri istersiniz:

  1. Medya dosyalarınızı birçok proje tarafından kullanılan tek bir git deposunda saklayın
  2. Yerel makinenizdeki projelerin herhangi birinde bir medya dosyasını değiştirirseniz, hemen diğer tüm projelerde görünmelidir (böylece her zaman + push + pull yapmak istemezsiniz)

Ne yazık ki, istediğiniz şey için nihai bir çözüm yoktur, ancak hayatınızı kolaylaştırabileceğiniz bazı şeyler vardır.

Öncelikle önemli bir şeye karar vermelisiniz: proje veri havuzunuzdaki her sürüm için medya dosyalarının sürümüne bir referans mı saklamak istiyorsunuz? Örneğin example.com adlı bir projeniz varsa, 2 hafta önce hangi stili kullandığını bilmeniz mi gerekiyor? Veya en son her zaman (veya çoğunlukla) en iyisi mi?

Bunu bilmenize gerek yoksa, çözüm kolaydır:

  1. medya dosyaları için bir havuz ve her proje için bir havuz oluşturun
  2. projelerinizde yerel olarak klonlanan medya deposuna işaret eden sembolik bir bağlantı oluşturun. Göreceli bir sembolik bağlantı (örneğin ../media) oluşturabilir ve medya dizininin aynı yerde olması için herkesin projeyi teslim alacağını varsayabilir veya sembolik bağlantının adını .gitignore'a yazabilir ve herkes karar verebilir burada medya dosyalarını koyar.

Ancak çoğu durumda, bu sürüm bilgilerini bilmek istersiniz. Bu durumda iki seçeneğiniz vardır:

  1. Her projeyi büyük bir depoda saklayın. Bu çözümün avantajı, medya havuzunun yalnızca 1 kopyasına sahip olmanızdır. En büyük dezavantaj, proje sürümleri arasında geçiş yapmanın çok daha zor olmasıdır (farklı bir sürüme ödeme yaparsanız her zaman TÜM projeleri değiştirirsiniz)

  2. Alt modülleri kullanın (cevap 1'de açıklandığı gibi). Bu şekilde medya dosyalarını bir havuzda depolayacaksınız ve projeler yalnızca belirli bir medya repo sürümüne bir başvuru içerecektir. Ancak bu şekilde normalde medya deposunun birçok yerel kopyasına sahip olursunuz ve bir medya dosyasını tüm projelerde kolayca değiştiremezsiniz.

Ben olsaydım muhtemelen birinci veya üçüncü çözümü seçebilirdim (sembolik bağlantılar veya alt modüller). Alt modülleri kullanmayı seçerseniz, hayatınızı kolaylaştırmak için hala birçok şey yapabilirsiniz:

  1. Taahhüt etmeden önce alt modül dizinini yeniden adlandırabilir ve ortak bir medya dizinine bir sembolik bağlantı koyabilirsiniz. İşlemeye hazır olduğunuzda, sembolik bağlantıyı kaldırabilir ve alt modülü geri kaldırabilir ve ardından taahhütte bulunabilirsiniz.

  2. Medya havuzunun kopyalarından birini tüm projelerinize uzak havuz olarak ekleyebilirsiniz.

Yerel dizinleri uzaktan kumanda olarak şu şekilde ekleyebilirsiniz:

cd /my/project2/media
git remote add project1 /my/project1/media

/ My / project1 / media içindeki bir dosyayı değiştirirseniz, uzak bir sunucuya göndermeden dosyayı teslim edebilir / / my / project2 / media'dan alabilirsiniz:

cd /my/project1/media
git commit -a -m "message"
cd /my/project2/media
git pull project1 master

Diğer kullanıcılarla paylaşmadığınız için bu işlemleri daha sonra (git reset ile) kaldırabilirsiniz.


1
Apache'nin wwwklasöründen çalıştığınız web ile ilgili projeler için .htaccess, wwwklasörün veya projenizin köküne, Options +FollowSymLinksiçinde veya daha iyisi olan bir dosyayı yerleştirmelisiniz <IfModule mod_rewrite.c>{new line}Options +FollowSymLinks{new line}RewriteEngine on{new line}</IfModule> ( {new line}gerçek yeni satırla değiştirin )

3

Diğer cevapların önerdiği alt ağaç ve alt modüllerle ilgili sorunlar yaşadım ... esas olarak SourceTree kullanıyorum ve oldukça buggy görünüyor.

Bunun yerine, SymLinks kullanarak sona erdi ve bu iyi çalışıyor gibi görünüyor, bu yüzden burada olası bir alternatif olarak gönderiyorum.

Burada tam bir rehber var: http://www.howtogeek.com/howto/16226/complete-guide-to-symbolic-links-symlinks-on-windows-or-linux/

Ancak temel olarak, yükseltilmiş bir komut isteminde iki yolu mklink etmeniz gerekir. / J sabit bağlantı önekini kullandığınızdan emin olun. Bu satırlar boyunca bir şey: mklink / JC: \ projects \ MainProject \ plugins C: \ projects \ SomePlugin

Ayrıca göreli klasör yollarını kullanabilir ve projenizi ilk kez kontrol ettiklerinde her bir kişi tarafından yürütülecek bir yarasa koyabilirsiniz.

Örnek: mklink / J. \ Assets \ TaqtileTools .. \ TaqtileHoloTools

Klasör bağlandıktan sonra ana deponuzda referans veren klasörü görmezden gelmeniz gerekebilir. Aksi halde gitmekte fayda var.

Not Bu gönderi bu soruya yinelenen bir soru olarak işaretlendiğinden, başka bir gönderiden yinelenen yanıtımı sildim.

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.