Ayır ayrı Gıt deposuna alt
Alt dizinleri içerir Git bir depo var. Şimdi dizinlerinin diğer ilgisiz ve ayrı bir depo için ayrılmış olması gerektiğini buldum.
Nasıl alt dizin içindeki dosyalar geçmişini tutarken bunu yapabilir miyim?
Bir klon yapmak ve her klon istenmeyen parçaları kaldırmak olabilir sanırım, ama bu büyük bir revizyon vb kontrol dışarı ne zaman bana tam ağaç verecekti sanırım. Bu kabul edilebilir, ama iki depoları ortak bir tarih değilmiş gibi davranmak mümkün olmasını tercih ederim.
Sadece açıklığa kavuşturmak için, aşağıdaki yapıya sahibim:
XYZ/
.git/
XY1/
ABC/
XY2/
Ama onun yerine bunu istiyorum:
XYZ/
.git/
XY1/
XY2/
ABC/
.git/
ABC/
CEVAP
GüncellemeBu süreç gıt Ekibi yeni bir araç, git subtree ile çok daha kolay yaptı o kadar yaygındır. Buraya bakın: Detach subdirectory into separate Git repository
Depoyu klonlamak ve git filter-branch yeni repo hariç her şey istediğiniz alt çöp toplama işaretlemek için kullanın.
Yerel depoyu klonlamak için:
git clone /XYZ /ABC(Not: depoyu sabit bağlantıları kullanarak klonlanmış olacak, ama bu sabit bağlantılı dosyaların kendilerini değiştirilmeyecek, çünkü bu bir sorun değil - yenileri oluşturulur.)
Şimdi, bizi koru ilginç kolları istediğimiz için yeniden yazmak gibi, ve sonra kaldırmak kökeni önlemek için bastırıyor ve emin olmak için eski tamamlar olmayacak tarafından başvurulan köken:
cd /ABC for i in branch1 br2 br3; do git branch -t $i origin/$i; done git remote rm originveya tüm uzak dalları:
cd /ABC for i in $(git branch -r | sed "s/.*origin\///"); do git branch -t $i origin/$i; done git remote rm originŞimdi de alt yapısı var olan etiketleri kaldırmak isteyebilirsiniz; ayrıca bunu daha sonra da yapabilirsiniz, ama repo tekrar budamak gerekebilir. Yapmadım ve tüm etiketleri için
WARNING: Ref 'refs/tags/v0.1' is unchangedbir alt proje için tüm ilgisiz olduklarından (); ayrıca, daha fazla boşluk iadesi gibi etiketleri çıkardıktan sonra. Görünüşe göregit filter-branchDiğer etiketler yeniden yazmak gerekir, ama bunu doğrulamak olamazdı. Eğer tüm etiketleri kaldırmak istiyorsanız,git tag -l | xargs git tag -dkullanın.Daha sonra filtre-şube kullanımı ve diğer dosyaları dışlamak için Sıfırla, budanmış olabilir. Umalım da
--tag-name-filter cat --prune-emptyboş tamamlar ve etiketleri (bu imza şerit açılacaktır) yeniden kaldırmak için ekleyin:git filter-branch --tag-name-filter cat --prune-empty --subdirectory-filter ABC -- --allveya alternatif olarak, sadece KAFASI şube yeniden yazmak ve etiketleri ve diğer branşları görmezden için:
git filter-branch --tag-name-filter cat --prune-empty --subdirectory-filter ABC HEADSonra yedekleme alanı gerçekten geri olabilir bu yüzden reflogs sil (gerçi operasyon yıkıcıdır)
git reset --hard git for-each-ref --format="%(refname)" refs/original/ | xargs -n 1 git update-ref -d git reflog expire --expire=now --all git gc --aggressive --prune=nowve şimdi tüm geçmişi muhafaza ile alt dizin ABC yerel ve git deposu var.
En kullanır, git filter-branch nitekim 23 ** eklenen bir parametre olmalıdır. not: Evet gerçekten dash dash alanı all çizgi çizgi. Bu komut için son parametre olması gerekir. Matlı keşfettiği gibi, bu proje, şube ve etiketler yeni repo dahil tutar.
Edit: depoyu aslında her zaman böyle değildi) daralmış olduğundan emin olun, örneğin, yapmak için dahil edilmiştir açıklamaları aşağıda çeşitli öneriler.

Ayır ayrı Gıt deposuna alt...
Botlar ayrı istatistikler için insan z...
ResourceDictionary ayrı bir derleme...
Her sekme için bir Yığın Android Parça...
Nasıl ayrı veritabanı için birden çok ...