filter-branch --tree-filter 후에 git repo에서 refs / original / heads / master를 제거 하시겠습니까?


180

여기에 질문 한 것과 같은 질문이 있습니다 : 루트 디렉토리의 새로운 자식 저장소는 하위 디렉토리에 존재하는 저장소를 가정합니다.

나는이 대답을 여기에 따랐다 : 루트 디렉토리의 새로운 자식 저장소는 하위 디렉토리에 존재하는 저장소를 가정합니다.

이제 gitk --all두 개의 기록을 보여줍니다. 하나는 현재에서 끝나고 master다른 하나는라는 이름 original/refs/heads/master입니다.

이 두 번째 역사가 무엇인지 또는 저장소에서 제거하는 방법을 모르겠습니다. 내 저장소에 두 개의 이력이 필요하지 않습니다.

어떻게 제거합니까?

자신을 재현하려면 :

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

(필터 브랜치 맨 페이지에서 직접 가져 왔습니다.)

이것은 당신에게 적용되지 않지만, 이것을 찾을 수있는 다른 사람들에게 : 디스크 공간을 많이 차지하는 컨텐츠 를 제거 하는 필터 브랜치를 수행하는 경우 , 참조 로그 를 실행 git reflog expire --expire=now --all하고 git gc --prune=now만료하고 현재 사용하지 않는 객체를 삭제할 수도 있습니다 . (경고 : 완전히 돌이킬 수 없음. 그렇게하기 전에 반드시 확인하십시오.)


.git / 정보 / 심판 및 .git는 / 포장 - 심판의 외모는 어쩌면이 대신 말을해야 좋아 : 만료 GC reflog 업데이트-REF를 수행 한 후,이 파일의 모두는 여전히 원래의 심판을 참조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

11

Windows PowerShell을 사용하는 경우 :

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

7

filter-branch리포지토리가 참조 로그 및 가비지 수집을 정리해야하므로 백업을 유지합니다. 삭제하기 전에이 백업이 필요하지 않은지 확인하십시오.

rm -Rf .git/refs/original
git gc --aggressive --prune=now
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.