ลบ refs / original / heads / master จาก git repo หลังจาก filter-branch --tree-filter หรือไม่


180

ฉันมีคำถามเดียวกันกับที่ถามที่นี่: ที่เก็บ git ใหม่ในไดเรกทอรีรากเพื่อใช้พื้นที่เก็บข้อมูลที่มีอยู่ในไดเรกทอรีย่อย

ฉันได้ทำตามคำตอบนี้ที่นี่: ที่เก็บ git ใหม่ในไดเรกทอรีรากเพื่อใช้พื้นที่เก็บข้อมูลที่มีอยู่ในไดเรกทอรีย่อย

ตอนนี้gitk --allแสดงให้เห็นว่าทั้งสองประวัติศาสตร์: หนึ่งสูงสุดในปัจจุบันและเป็นหนึ่งในชื่อmasteroriginal/refs/heads/master

ฉันไม่รู้ว่าประวัติที่สองนี้คืออะไรหรือจะลบออกจาก repo ได้อย่างไร ฉันไม่ต้องการประวัติสองอันในที่เก็บของฉัน

ฉันจะกำจัดมันได้อย่างไร

ในการทำซ้ำตัวเอง:

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'

ตอนนี้เรามีปัญหาของโปสเตอร์ต้นฉบับ ลองย้ายรูทของ git repo ไปที่ project-root โดยใช้คำตอบที่ลิงค์ด้านบน:

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

ตอนนี้ดูปัญหาปัจจุบันของฉัน:

gitk --all &
git show-ref

ฉันจะกำจัดrefs/original/heads/masterและประวัติที่เกี่ยวข้องทั้งหมดได้อย่างไร


คำตอบ:


321

refs/original/*จะมีการสำรองข้อมูลในกรณีที่คุณเลอะสาขากรองของคุณ เชื่อฉันมันเป็นความคิดที่ดีจริงๆ

เมื่อคุณตรวจสอบผลลัพธ์แล้วและคุณมั่นใจมากว่าคุณมีสิ่งที่คุณต้องการคุณสามารถลบการอ้างอิงที่สำรองไว้:

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

หรือถ้าคุณทำสิ่งนี้กับผู้อ้างอิงจำนวนมากและคุณต้องการล้างมันทั้งหมด:

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

(ที่นำโดยตรงจาก manpage สาขาตัวกรอง)

สิ่งนี้ไม่ได้มีผลกับคุณ แต่สำหรับคนอื่น ๆ ที่อาจพบสิ่งนี้: หากคุณทำฟิลเตอร์สาขาที่ลบเนื้อหาที่ใช้พื้นที่ดิสก์ที่สำคัญคุณอาจต้องการเรียกใช้git reflog expire --expire=now --allและgit gc --prune=nowหมดอายุ reflogs ของคุณและลบวัตถุที่ไม่ได้ใช้ตอนนี้ . (คำเตือน: สมบูรณ์ไม่สามารถย้อนกลับได้ทั้งหมดต้องแน่ใจก่อนที่จะทำ)


หลังจากทำการอัปเดตแล้ว reflog จะหมดอายุและ gc ทั้งสองไฟล์นี้ยังคงอ้างอิง ref ต้นฉบับ: .git / info / refs และ. git / packing-refs ดูเหมือนว่าอาจจะพูดแบบนี้แทน:git update-ref -d refs/original/refs/heads/master
lhunath

1
ฉันเดาว่าคุณผสมคำโดยไม่ได้ตั้งใจ: ถ้าฉันถูกต้องมันควรจะเป็นgit update-ref -d original/refs/heads/masterอย่างไร อย่างไรก็ตามคำสั่งที่สองของคุณใช้ได้สำหรับฉันเท่านั้น
JJD

4
มันคือgit update-ref -d refs/original/refs/heads/masterbtw git show-refท่านสามารถเข้าดูชื่อเต็มใช้
กระตุ้น

4
สิ่งที่สั้นกว่าgit show-ref refs/original/* --hash | xargs -n 1 git update-ref -d?
CharlesB


7

filter-branchเก็บข้อมูลสำรองดังนั้นที่เก็บข้อมูลจำเป็นต้องล้างข้อมูล reflogs และการรวบรวมขยะ ตรวจสอบให้แน่ใจว่าไม่จำเป็นในการสำรองข้อมูลนี้ก่อนที่จะลบ:

rm -Rf .git/refs/original
git gc --aggressive --prune=now
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.