Akış yukarı proje gücü yöneticiye aktarıldıktan sonra bir git alt ağacını nasıl düzeltirim?


13

Git subtree kullanmayı deniyorum ve aşağıdaki durumla karşılaştım.

Repo'ma harici bir proje eklemek için git subtree'yi kullandım, projenin geçmişine atıfta bulunmak ve daha sonra yukarı akış projesine katkıda bulunmak istediğim için kasıtlı olarak yukarı akış projesi için tüm tarihi sakladım.

Anlaşıldığı üzere, yukarı akış projesine başka bir katılımcı yanlışlıkla büyük bir dosyayı ana şubeye itti. Bunu düzeltmek için, yukarı akış projesi tarihi yeniden yazdı ve güç ustaya itti. Benim "monorepo" oluştururken, bu taahhüt dahil ve ben de kaldırmak istiyorum.

Depomu alt ağacın yeni geçmişini yansıtacak şekilde nasıl güncelleyebilirim?

İlk denemem, alt ağacı ve tüm geçmişi tamamen kaldırmak için filtre dalı kullanmaktı.

git filter-branch --index-filter 'git rm -rf --cached --ignore-unmatch upstream-project-dir' --prune-empty HEAD

Alt ağacın eski sürümü kaldırıldıktan sonra, yeni yukarı akış master'ı kullanarak alt ağacı yeniden ekleyebilirim. Ancak, bu işe yaramadı çünkü bazı nedenlerden dolayı kayıt geçmişi hala git log çıktısında görünüyor.

Güncelleme

Minimal tekrarlanabilir bir örnek oluşturma adımlarını yazdım.

  1. Önce boş bir git repo oluşturun.

    git init test-monorepo
    cd ./test-monorepo
    
  2. Bir başlangıç ​​taahhüdü oluşturun.

    echo hello world > README
    git add README
    git commit -m 'initial commit'
    
  3. Şimdi harici bir proje için bir alt ağaç ekleyin.

    git remote add thirdparty git@github.com:teivah/algodeck.git
    git fetch thirdparty
    git subtree add --prefix algodeck thirdparty master
    
  4. Monorepo hakkında bazı taahhütlerde bulunun

    echo dont panic >> algodeck/README.md
    git commit -a -m 'test commit'
    
  5. Şimdi alt ağacı kaldırmak için git filter-branch'u kullanmayı deneyin.

    git filter-branch --index-filter 'git rm -rf --cached --ignore-unmatch algodeck' --prune-empty HEAD
    
  6. Git log çıktısını inceleyin, sadece ilk taahhüdümü görmeyi bekliyorum.

    git log
    

Eski taahhütleri atmak için git gc --prune = 'i denemeye çalıştınız mı? Eski sürüm taahhütlerinde bazı referanslar var mı?
Damiano

1
Henüz denemedim, ama git gc --prune=nowsadece görünmeyen taahhütleri silmekle kalmaz git logmıydı?
csnate

git branch -all kullanarak ("eski" taahhütleri görmek için kullandığınızı varsayalım) da geçerli şubenizle ilgili olmayan taahhütleri göstermelidir.
Damiano

1
Aslında, sadece git logtartışmalar yapıyordum ve hala eski taahhütleri görüyorum.
csnate

Lütfen git log --pretty --all --graph'ınızı gönderebilir misiniz? Sadece durumunuzu anlamak için
Damiano

Yanıtlar:


0

Tarihinizde zaten kötü bir kararlılığa sahipsiniz ve devam etmeden önce ondan kurtulmanız gerekiyor

diyelim ki masterson işin yönlendirildiğini ve başka bir şey yapamadığını varsayalım (gerçekten senin kollarını göremiyorum, bu yüzden başlamak için bir şey varsaymalıyım)

önceki taahhüdünüzü kontrol edebilir ve her durumda zararsız olacak şekilde şube işaretçinizi 1 adım geri (veya X adım geri) itebilir ve sonra tekrar çekebilirsiniz

Örneğin

git checkout master~1
git branch master -f
git checkout master
git pull
  1. git checkout master~1 master'ın üst taahhüdünü kontrol etmek için git, şubeler dışında olduğumuzu uyardı
  2. git branch master -f mevcut ödemeyi tekrar master olmaya zorlamak, yani ana şubeyi önceki taahhüdüne (veya X önceki taahhüdüne) geri sarar ve buradan, yukarı akımın bir güç yapıp yapmadığı önemli değildir, normal olarak devam edebiliriz, hatta Gerekirse yukarıdaki adıma geri dönün, yukarı akıştan bir şey kaybetmeden sadece ustayı tekrar çekebiliriz (ki bu bizim için de salt okunur olabilir, bunun için hiçbir şey itmeyiz)
  3. git checkout master "geri sarmak" ana dalımızda olmak, adım attığımız aynı taahhüt, ama şimdi bunun yerine dalda olmak
  4. git pulltekrar master çekmek için (ile veya onsuz olabilir --prune), yukarı akış yönelmişse, buradan tekrar yola çıkacağız, eğer değilse, aynısını alırsak ve varsaymazsak, belki de biz Yukarıdaki 1. adıma geri dönmeniz ve daha fazla taahhüt geri almanız gerekir, örneğin git checkout master~5veya her neyse (gerektiği gibi)

Bunun işe yarayacağını sanmıyorumgit subtree
csnate

@csnate, bir alt rapordan önceki taahhütleri kontrol etmek ve çok benzer prosedürü takip etmek mümkündür, bir MCVE oluşturursanız, stackoverflow.com/help/minimal-reproducible-example
arhak

GitHub'da örnek bir repo oluşturmaya çalışacağım.
csnate

Orijinal soruda sorunu gösteren bir dizi adım oluşturdum.
csnate

0
  1. deponuzda, bu uzaktan kumanda için taahhütlerin geçmişini temizleyin:

    git fetch upstream
    
  2. kendi taahhütlerinizden birinin büyük dosyayı içeren bir taahhüdü varsa, bu büyük dosyanın artık referans gösterilmemesi için geçmişinizi yeniden yazın

    # using one or more of the following commands :
    git rebase --interactive
    git filter-branch
    ...
    

Bu iki adımla, repodaki herhangi bir taahhütte büyük dosyaya artık referans verilmeyecektir.
Buna ek olarak, git çöp toplayıcısını çalıştırdığında ve sarkan lekeler için son kullanma gecikmelerine ulaşıldığında, bir süre sonra sabit diskinizden silinecektir.


Bu büyük dosyayı en kısa sürede sabit diskinizden silmeniz gerekiyorsa:

Manuel olarak çalıştır

git gc --prune=now
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.