====== Split or merge repos ====== ====== Merge repos into one ====== ===== subtree add ===== Adding remote repos as subtrees results in merges in history, which cannot be rebased to get flat history. Rebasing causes to subtree appear in main repo root directory instead of subdirectory. Better use next method with moving files manually. git remote add my-subtree /path/to/subtree.git git subtree add --prefix=vendor/ my-subtree master # with squashed commits # git subtree add --squash --prefix=vendor/ my-subtree master # cleanup # git rebase my-subtree/master ===== Merge another repo (RRR) into directory of repo (LLL) ===== Idea is to fetch remote repo RRR into local repo LLL Then modify file location of repo BBB to be in desired path and merge it into repo LLL. ######### WAY 2 # Clone RRR repo temporary to change all file paths to new repo. cd tmp git clone http://URI_to_RRR_repo git checkout main # now move files from remote repo RRR into correct path: mkdir app_RRR # create new location path (which will be merged to destination RRR repo) git checkout -b branch_change_file_location git mv -k * app_RRR/src git mv src app_RRR/src git mv .gitignore .gitlab-ci.yml .gitmodules app_RRR/src git commit -m "location of app_RRR adapted to local repo" # optionally reword all commits: git rebase --root -x 'git commit --amend' cd LLL_repo git remote add RRR /tmp/cloned_RRR_repo git fetch RRR git merge RRR/branch_change_file_location --allow-unrelated-histories ######### WAY 2 END ######### WAY 1 git remote add RRR http://URI_to_RRR_repo git fetch RRR git checkout -b branch_change_file_location RRR/main # now move files from remote repo RRR into correct path: mkdir app_RRR git mv src app_RRR/src git commit -m "location of app_RRR adapted to local repo" # switch to LLL repo git checkout master # merge previously created branch "LLL/branch_change_file_location" into "LLL/master" git merge branch_change_file_location --allow-unrelated-histories git commit ######### WAY 1 END # cleanup git remote rm RRR git branch -d branch_change_file_location # optionally - rebase: # rebase can be problematic. Conflict will be on commonly used paths (readme, Makefile, src, etc) # between LLL and RRR repo git rebase # push merged master git push ====== Split dirs into separate repos ====== ===== git filter tools ===== [[https://github.com/slobobaby/git_filter]] ===== Detach(move) subdirectory into separate Git repository ===== [[http://stackoverflow.com/questions/359424/detachmove-subdirectory-into-separate-git-repository]] # Split dir form repo pushd git subtree split -P -b popd # Create new repo mkdir pushd git init git pull # Link the new repo to Github or wherever git remote add origin git push origin -u master #Cleanup, if desired popd # get out of pushd git rm -rf ====== Split one file from repo ====== # reduce repo to one folder git filter-branch --prune-empty --subdirectory-filter etc -- --all # reduce repo to some given file/files git filter-branch -f --prune-empty --index-filter 'git rm --cached --ignore-unmatch $(git ls-files | grep -v "tmarc.xsl\|check-pazpar2.sh")' # clean git reflog expire --expire=now --all && git gc --prune=now --aggressive