SORU
11 Aralık 2008, PERŞEMBE


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
11 Aralık 2008, PERŞEMBE


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.

  1. 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.)

  2. Ş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
    
  3. Ş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öre git 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.

  4. 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
    
  5. 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.

Bunu Paylaş:
  • Google+
  • E-Posta
Etiketler:

YORUMLAR

SPONSOR VİDEO

Rastgele Yazarlar

  • paulandstorm

    paulandstorm

    4 EYLÜL 2006
  • Toddler Fun Learning

    Toddler Fun

    8 ŞUBAT 2013
  • WePlayWeWatch

    WePlayWeWatc

    3 Temmuz 2013