Remove refs/original/heads/master from git repo after filter-branch --tree-filter?
Solution 1
refs/original/*
is there as a backup, in case you mess up your filter-branch. Believe me, it's a really good idea.
Once you've inspected the results, and you're very confident that you have what you want, you can remove the backed up ref:
git update-ref -d refs/original/refs/heads/master
or if you did this to many refs, and you want to wipe it all out:
git for-each-ref --format="%(refname)" refs/original/ | xargs -n 1 git update-ref -d
(That's taken directly from the filter-branch manpage.)
This doesn't apply to you, but to others who may find this: If you do a filter-branch which removes content taking up significant disk space, you might also want to run git reflog expire --expire=now --all
and git gc --prune=now
to expire your reflogs and delete the now-unused objects. (Warning: completely, totally irreversible. Be very sure before you do it.)
Solution 2
And if you're in Windows PowerShell:
git for-each-ref --format="%(refname)" refs/original/ | foreach-object -process { git update-ref -d $_ }
Solution 3
filter-branch
keeps backups so repository need to clean up reflogs and garbage collect. Make sure that have no need in this backups before deletion:
rm -Rf .git/refs/original
git gc --aggressive --prune=now
goofeedude
Updated on September 19, 2020Comments
-
goofeedude over 3 years
I had the same question as asked here: New git repository in root directory to subsume an exist repository in a sub-directory
I followed this answer here: New git repository in root directory to subsume an exist repository in a sub-directory
Now,
gitk --all
shows two histories: one culminating in the currentmaster
, and one namedoriginal/refs/heads/master
.I don't know what this second history is, or how to remove it from the repo. I don't need two histories in my repository.
How do I get rid of it?
To reproduce yourself:
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'
Now we have the original poster's problem. Let's move the root of the git repo to project-root using the answer linked above:
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
Now, see my current problem:
gitk --all & git show-ref
How do I get rid of
refs/original/heads/master
and all associated history?-
user about 9 yearspossible duplicate of How to delete the old history after running git filter-branch?
-
-
lhunath almost 12 yearsAfter doing update-ref, reflog expire and gc, both of these files still reference the original ref: .git/info/refs and .git/packed-refs Looks like maybe that should say this instead:
git update-ref -d refs/original/refs/heads/master
-
JJD almost 12 yearsI guess you accidentally mixed the words: If I am right, it should be
git update-ref -d original/refs/heads/master
? However, only your second command worked for me. -
poke almost 12 yearsIt’s
git update-ref -d refs/original/refs/heads/master
btw. You can see the full name usinggit show-ref
. -
CharlesB over 10 yearsWhat about the shorter
git show-ref refs/original/* --hash | xargs -n 1 git update-ref -d
? -
TamaMcGlinn over 3 yearsusing gitextensions there is View > Show reflog commits, which totally obviates this backup; you always have a clearly visible backup whatever you do in git this way.