Hapus referensi / asli / kepala / master dari git repo setelah cabang-filter - pohon-filter

180

Saya memiliki pertanyaan yang sama seperti yang ditanyakan di sini: Repositori git baru di direktori root untuk berlangganan repositori yang ada di sub-direktori

Saya mengikuti jawaban ini di sini: Repositori git baru di direktori root untuk berlangganan repositori yang ada di sub-direktori

Sekarang, gitk --allperlihatkan dua sejarah: satu memuncak pada arus master, dan satu lagi bernama original/refs/heads/master.

Saya tidak tahu apa sejarah kedua ini, atau bagaimana menghapusnya dari repo. Saya tidak perlu dua riwayat di repositori saya.

Bagaimana saya menyingkirkannya?

Untuk mereproduksi diri sendiri:

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'

Sekarang kita punya masalah dengan poster aslinya. Mari kita pindahkan root dari git repo ke project-root menggunakan jawaban yang terhubung di atas:

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

Sekarang, lihat masalah saya saat ini:

gitk --all &
git show-ref

Bagaimana cara saya singkirkan refs/original/heads/masterdan semua riwayat yang terkait?

goofeedude
sumber

Jawaban:

321

refs/original/*apakah ada sebagai cadangan, jika Anda mengacaukan cabang filter Anda. Percayalah, itu ide yang sangat bagus.

Setelah Anda memeriksa hasilnya, dan Anda sangat yakin bahwa Anda memiliki apa yang Anda inginkan, Anda dapat menghapus referensi yang dicadangkan:

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

atau jika Anda melakukan ini pada banyak referensi, dan Anda ingin menghapus semuanya:

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

(Itu diambil langsung dari manual cabang-filter.)

Ini tidak berlaku untuk Anda, tetapi untuk orang lain yang mungkin menemukan ini: Jika Anda melakukan filter-branch yang menghapus konten yang menggunakan ruang disk yang signifikan, Anda mungkin juga ingin menjalankan git reflog expire --expire=now --alldan git gc --prune=nowuntuk kedaluwarsa reflog Anda dan menghapus objek yang sekarang tidak digunakan. . (Peringatan: sepenuhnya, benar-benar tidak dapat dipulihkan. Pastikan sebelum Anda melakukannya.)

Cascabel
sumber
Setelah melakukan pembaruan-ref, reflog kedaluwarsa, dan gc, kedua file ini masih merujuk pada referensi asli: .git / info / refs dan .git / packed-refs Sepertinya mungkin yang seharusnya mengatakan ini sebagai gantinya:git update-ref -d refs/original/refs/heads/master
lhunath
1
Saya kira Anda tidak sengaja mencampur kata-kata: Jika saya benar, itu seharusnya git update-ref -d original/refs/heads/master? Namun, hanya perintah kedua Anda yang berhasil untuk saya.
JJD
4
Ini git update-ref -d refs/original/refs/heads/masterbtw. Anda dapat melihat nama lengkap menggunakan git show-ref.
colek
4
Bagaimana dengan yang lebih pendek git show-ref refs/original/* --hash | xargs -n 1 git update-ref -d?
CharlesB
11

Dan jika Anda menggunakan Windows PowerShell:

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

filter-branchmenyimpan cadangan sehingga repositori perlu membersihkan reflog dan pengumpulan sampah. Pastikan Anda tidak perlu mencadangkan ini sebelum dihapus:

rm -Rf .git/refs/original
git gc --aggressive --prune=now
Kiryl Plyashkevich
sumber