Ayrıntılı Çözüm
Npm kullanarak git alt modüllerine hızlı bir alternatif için bu cevabın sonundaki nota (son paragraf) bakın;)
Aşağıdaki cevapta, bir depodan bir klasörü nasıl çıkaracağınızı ve ondan bir git deposu oluşturacağınızı ve ardından onu bir klasör yerine bir alt modül olarak dahil edeceğinizi öğreneceksiniz .
Gerg Bayer'in Dosyaları Bir Git Deposundan Diğerine Taşıma, Geçmişi Koruma başlıklı makalesinden esinlenilmiştir.
Başlangıçta şöyle bir şeyimiz var:
<git repository A>
someFolders
someFiles
someLib <-- we want this to be a new repo and a git submodule!
some files
Adımlar feryat, ben bu sevk edecektir someLib
olarak <directory 1>
.
Sonunda şöyle bir şeye sahip olacağız:
<git repository A>
someFolders
someFiles
@submodule --> <git repository B>
<git repository B>
someFolders
someFiles
Başka bir depodaki bir klasörden yeni bir git deposu oluşturun
Aşama 1
Bölmek için deponun yeni bir kopyasını alın.
git clone <git repository A url>
cd <git repository A directory>
Adım 2
Mevcut klasör yeni depo olacaktır, bu nedenle mevcut uzaktan kumandayı kaldırın.
git remote rm origin
Aşama 3
İstenen klasörün geçmişini çıkarın ve işleyin
git filter-branch --subdirectory-filter <directory 1> -- --all
Artık deponuzun directory 1
kök dizininde bulunan ve ilgili tüm işleme geçmişiyle birlikte bir git deposuna sahip olmalısınız .
4. adım
Çevrimiçi deponuzu oluşturun ve yeni deponuzu itin!
git remote add origin <git repository B url>
git push
upstream
İlk itmeniz için şubeyi ayarlamanız gerekebilir
git push --set-upstream origin master
Temizle <git repository A>
(isteğe bağlı, yorumlara bakın)
Bu klasörün geçmişinin izlerini (dosyaları ve işleme geçmişini) silmek istiyoruz <git repository B>
, <git repository A>
bu nedenle geçmiş yalnızca bir kez var.
Bu, hassas verilerin github'dan kaldırılmasına dayanmaktadır .
Yeni bir klasöre gidin ve
git clone <git repository A url>
cd <git repository A directory>
git filter-branch --force --index-filter 'git rm --cached --ignore-unmatch <directory 1> -r' --prune-empty --tag-name-filter cat -- --all
<directory 1>
Kaldırmak istediğiniz klasörle değiştirin . -r
bunu belirtilen dizin içinde yinelemeli olarak yapacak :). Şimdi etmek itmek origin/master
ile--force
git push origin master --force
Boss Aşaması (Aşağıdaki Nota bakın)
Bir oluşturun submodule gelen <git repository B>
INTO<git repository A>
git submodule add <git repository B url>
git submodule update
git commit
Her şeyin beklendiği gibi çalışıp çalışmadığını doğrulayın ve push
git push origin master
Not
Tüm bunları yaptıktan sonra, benim durumumda kendi bağımlılıklarımı yönetmek için npm kullanmanın daha uygun olduğunu fark ettim . Git url'leri ve sürümlerini belirleyebiliriz, bağımlılıklar olarak package.json git url'lerini görebiliriz .
Eğer bu şekilde yaparsanız, bir gereksinim olarak kullanmak istediğiniz deposu bir olmalıdır npm modülü bir içermelidir böylece package.json
dosya veya bu hatayı alırsınız: Error: ENOENT, open 'tmp.tgz-unpack/package.json'
.
tldr (alternatif çözüm)
Git url'leri ile npm kullanmayı ve bağımlılıkları yönetmeyi daha kolay bulabilirsiniz :
- Klasörü yeni bir depoya taşı
npm init
her iki depoda da çalıştır
npm install --save git://github.com/user/project.git#commit-ish
bağımlılıklarınızın kurulmasını istediğiniz yerde çalıştırın