Git subdirectory filter with existing directory structure
I’m splitting out a Git repository using the –subdirectory-filter option of filter-branch which is working great except it pulls everything up to the root of the repository.
I currently have
- How can I rewrite history so that all files, except the ones I already moved, are in a subdirectory?
- Filter-branch filters out directory within subdirectory
- detaching a subdirectory of a repo and making it a branch of another repo?
- Cleaning out unused blobs using git merge --squash followed by git gc?
- split repo using git filter-branch: how to recover history from renamed/moved files?
- git filter-branch led to a disconnected history: how to get rid of the old commits?
ABC - DEF - GHI - JKL - MNO
And the result of this command:
git filter-branch -f --subdirectory-filter ABC/DEF --prune-empty -- --all
Where what I really want is this:
ABC - DEF - GHI - JKL
I can’t see anything in the Git docs that shows a filter option which preserves (or sets) the directory structure and I haven’t been able to find a command I can run after the filtering to remap the structure to how I want it.
Is this possible?
2 Solutions collect form web for “Git subdirectory filter with existing directory structure”
I found an answer here which does the trick.
git filter-branch -f --index-filter 'git ls-files -s \ | sed "s-\t-&ABC/DEF/-" \ | GIT_INDEX_FILE=$GIT_INDEX_FILE.new git update-index --index-info \ && mv $GIT_INDEX_FILE.new $GIT_INDEX_FILE'
I’ve only given this cursory testing myself, but I think you can use
git filter-branch with
--tree-filter to rewrite the branch, but removing all files apart from those in the subdirectory
ABC/DEF, with something like the following:
git filter-branch --tree-filter \ 'find . -path ./ABC/DEF -prune -o -type f -print0 | xargs -0 rm -f' \ --prune-empty HEAD
Note that the
find command only removes files, not directories, but since git doesn’t store empty directories, this should still produce the result you want.