Remover refs / original / heads / master do git repo após filter-branch --tree-filter?


180

Eu tive a mesma pergunta que fiz aqui: Novo repositório git no diretório raiz para incluir um repositório existente em um subdiretório

Segui esta resposta aqui: Novo repositório git no diretório raiz para incluir um repositório existente em um subdiretório

Agora, gitk --allmostra duas histórias: uma culminando com a atual mastere outra com o nome original/refs/heads/master.

Não sei o que é essa segunda história ou como removê-la do repositório. Não preciso de dois históricos no meu repositório.

Como faço para me livrar dele?

Para se reproduzir:

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'

Agora temos o problema do pôster original. Vamos mover a raiz do repositório git para raiz do projeto usando a resposta vinculada acima:

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

Agora, veja meu problema atual:

gitk --all &
git show-ref

Como faço para me livrar refs/original/heads/mastere todo o histórico associado?


Respostas:


321

refs/original/*existe como backup, caso você estrague seu ramo de filtro. Acredite em mim, é uma muito boa ideia.

Depois de inspecionar os resultados e ter certeza de que tem o que deseja, você pode remover a referência de backup:

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

ou se você fez isso com muitos árbitros e deseja apagar tudo:

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

(Extraído diretamente da página de manual do filtro).

Isso não se aplica a você, mas a outras pessoas que podem achar isso: Se você faz uma ramificação de filtro que remove o conteúdo que ocupa muito espaço em disco, também poderá executar git reflog expire --expire=now --alle git gc --prune=nowexpirar seus reflogs e excluir os objetos agora não utilizados . (Aviso: completamente, totalmente irreversível. Tenha muita certeza antes de fazê-lo.)


Depois de fazer update-ref, reflog expirar e gc, ambos os arquivos ainda referenciar o árbitro original: .git / info / refs e .git / refs-embalados parece com talvez isso deveria dizer isso em vez disso:git update-ref -d refs/original/refs/heads/master
lhunath

1
Eu acho que você acidentalmente misturou as palavras: Se estou certo, deveria estar git update-ref -d original/refs/heads/master? No entanto, apenas seu segundo comando funcionou para mim.
JJD 06/07

4
É git update-ref -d refs/original/refs/heads/masterbtw. Você pode ver o nome completo usando git show-ref.
Poke

4
E quanto mais curto git show-ref refs/original/* --hash | xargs -n 1 git update-ref -d?
precisa

11

E se você estiver no Windows PowerShell:

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

7

filter-branchmantém backups para que o repositório precise limpar reflogs e coleta de lixo. Verifique se não há necessidade desses backups antes da exclusão:

rm -Rf .git/refs/original
git gc --aggressive --prune=now
Ao utilizar nosso site, você reconhece que leu e compreendeu nossa Política de Cookies e nossa Política de Privacidade.
Licensed under cc by-sa 3.0 with attribution required.