Filtre şubesinden sonra refs / orijinal / kafalar / master kaldır - ağaç filtre?


180

Burada sorulanla aynı soru vardı: Bir alt dizinde var olan bir depoyu var etmek için kök dizinde yeni git deposu

Bu cevabı burada takip ettim: Bir alt dizinde var olan bir depoyu devralmak için kök dizinde yeni git deposu

Şimdi, gitk --alliki tarih gösterir: biri akımla doruğa ulaşıyor master, diğeri ise original/refs/heads/master.

Bu ikinci tarihin ne olduğunu ya da repodan nasıl çıkarılacağını bilmiyorum. Depomda iki geçmişe ihtiyacım yok.

Ondan nasıl kurtulurum?

Kendinizi çoğaltmak için:

mkdir -p project-root/path/to/module
cd project-root/path/to/module
mkdir dir1 dir2 dir3 
for dir in * ; do touch $dir/source-file-$dir.py ; done
git init
git add .
git commit -m 'Initial commit'

Şimdi asıl posterin problemi var. Git bağlantısının kökünü yukarıda bağlantılı yanıtı kullanarak proje köküne taşıyalım:

git filter-branch --tree-filter 'mkdir -p path/to/module ; git mv dir1 dir2 dir3 path/to/module' HEAD
rm -rf path
cd ../../../ # Now PWD is project-root
mv path/to/module/.git .
git reset --hard

Şimdi, şu anki sorunuma bakın:

gitk --all &
git show-ref

refs/original/heads/masterİlişkili geçmişten ve ilgili geçmişten nasıl kurtulurum ?


Yanıtlar:


321

refs/original/*filtre dalınızı bozmanız durumunda yedek olarak bulunur. İnan bana, bu gerçekten iyi bir fikir.

Sonuçları inceledikten ve istediğiniz şeye sahip olduğunuzdan eminseniz, yedeklenen ref'yi kaldırabilirsiniz:

git update-ref -d refs/original/refs/heads/master

veya bunu birçok referansa yaptıysanız ve hepsini silmek istiyorsanız:

git for-each-ref --format="%(refname)" refs/original/ | xargs -n 1 git update-ref -d

(Bu doğrudan filtre dalı kılavuzundan alınır.)

Bu sizin için geçerli değildir, ancak başkalarına kim bu bulabilir: Bir filtre dalı yaparsanız kaldırır önemli disk alanı kadar içerik alma, ayrıca çalıştırmak isteyebilirsiniz git reflog expire --expire=now --allve git gc --prune=nowsizin reflogs sona erecek ve artık kullanılmayan nesneleri silmek . (Uyarı: tamamen, tamamen geri döndürülemez. Yapmadan önce çok emin olun.)


Update-ref, reflog expire ve gc yaptıktan sonra, bu dosyaların her ikisi de hala orijinal ref'ye başvurur: .git / info / refs ve .git / packed-refs Bunun yerine şunu söylemeli gibi görünüyor:git update-ref -d refs/original/refs/heads/master
lhunath

1
Sanırım kelimeleri yanlışlıkla karıştırdın: Haklıysam, olmalı git update-ref -d original/refs/heads/mastermı? Ancak, sadece ikinci emir benim için çalıştı.
JJD

4
Bu git update-ref -d refs/original/refs/heads/masterbtw. Düğmesini kullanarak tam adı görebilirsiniz git show-ref.
dürtmek

4
Daha kısa ne olacak git show-ref refs/original/* --hash | xargs -n 1 git update-ref -d?
CharlesB

11

Windows PowerShell'deyseniz:

git for-each-ref --format="%(refname)" refs/original/ | foreach-object -process { git update-ref -d $_ }

7

filter-branchyedekleri tutar böylece depo reflogs ve çöp toplama temizlemek gerekir. Silmeden önce bu yedeklemelere gerek olmadığından emin olun:

rm -Rf .git/refs/original
git gc --aggressive --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.