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 origin
veya 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 unchanged
bir 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-branch
Diğ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 -d
kullanı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-empty
boş 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 -- --all
veya 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 HEAD
Sonra 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=now
ve ş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...
Git, iki ayrı branşta diff dosya açıla...
En iyi ndb varlıkların sorgu çok sayıd...
Nasıl yeni bir Git deposuna tarihi ile...
Orijinal Github gelen yeni güncellemel...