¿Eliminar refs / original / heads / master del repositorio de git después de filter-branch --tree-filter?

180

Tuve la misma pregunta que se hizo aquí: Nuevo repositorio git en el directorio raíz para subsumir un repositorio existente en un subdirectorio

Seguí esta respuesta aquí: Nuevo repositorio git en el directorio raíz para subsumir un repositorio existente en un subdirectorio

Ahora, gitk --allmuestra dos historias: una que culmina en la corriente mastery otra que lleva el nombre original/refs/heads/master.

No sé qué es esta segunda historia o cómo eliminarla del repositorio. No necesito dos historias en mi repositorio.

¿Como me deshago de esto?

Para reproducirse:

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'

Ahora tenemos el problema del póster original. Muevamos la raíz del repositorio de git a project-root usando la respuesta vinculada anteriormente:

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

Ahora, mira mi problema actual:

gitk --all &
git show-ref

¿Cómo me deshago de refs/original/heads/mastertodo el historial asociado?

goofeedude
fuente

Respuestas:

321

refs/original/*está ahí como una copia de seguridad, en caso de que estropee su rama de filtro. Créeme, es una muy buena idea.

Una vez que haya inspeccionado los resultados y esté seguro de tener lo que desea, puede eliminar la referencia respaldada:

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

o si hiciste esto con muchos árbitros y quieres borrarlo todo:

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

(Esto se toma directamente de la página de manual de rama de filtro).

Esto no se aplica a usted, sino a otras personas que pueden encontrar esto: si realiza una rama de filtro que elimina el contenido que ocupa un espacio considerable en el disco, es posible que también desee ejecutar git reflog expire --expire=now --ally git gc --prune=nowexpirar sus registros y eliminar los objetos que no se utilizan ahora . (Advertencia: completamente, totalmente irreversible. Esté muy seguro antes de hacerlo).

Cascabel
fuente
Después de hacer la actualización-ref, reflog expirar y GC, ambos de estos archivos aún hacen referencia a que el árbitro original: .git / info / árbitros y .git / REF-envasados se parece que tal vez debería decir esto en su lugar:git update-ref -d refs/original/refs/heads/master
lhunath
1
Supongo que accidentalmente mezcló las palabras: si tengo razón, ¿debería ser así git update-ref -d original/refs/heads/master? Sin embargo, solo tu segundo comando funcionó para mí.
JJD
44
Por git update-ref -d refs/original/refs/heads/mastercierto. Puedes ver el nombre completo usando git show-ref.
meter
44
¿Qué pasa con el más corto git show-ref refs/original/* --hash | xargs -n 1 git update-ref -d?
CharlesB
11

Y si estás en Windows PowerShell:

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

filter-branchmantiene las copias de seguridad, por lo que el repositorio necesita limpiar los registros y la recolección de basura. Asegúrese de no tener necesidad en estas copias de seguridad antes de eliminarlas:

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