-
-
Save detunized/7c41718863ab94e7072f99a55a5bf9d4 to your computer and use it in GitHub Desktop.
#!/bin/bash | |
set -euo pipefail | |
$REPO_DIR=~/devel | |
repos="1password bitwarden dashlane lastpass opvault passwordbox roboform stickypassword truekey zoho-vault" | |
# pull all repos | |
( | |
for repo in $repos; do | |
echo $repo | |
cd $REPO_DIR/$repo | |
git pull -v --ff | |
done | |
) | |
# merge | |
( | |
rm -rf joined | |
mkdir joined | |
cd joined | |
git init . | |
for repo in $repos; do | |
git remote add $repo ~/devel/$repo-sharp | |
git fetch $repo | |
git checkout -b $repo $repo/master | |
echo -n "$repo: " > prefix | |
git filter-branch \ | |
-f \ | |
--tree-filter "mkdir -p .original/$repo && rsync -a --remove-source-files ./ .original/$repo/" \ | |
--msg-filter "cat $(pwd)/prefix -" \ | |
--env-filter 'GIT_COMMITTER_DATE="$GIT_AUTHOR_DATE"' \ | |
$repo | |
rm prefix | |
done | |
# create master | |
git checkout --orphan master | |
git rm -rf . | |
# cherry pick into the master | |
for i in $(git log --pretty='%H' --author-date-order --reverse $repos); do | |
GIT_COMMITTER_DATE=$(git log -1 --pretty='%at' $i) \ | |
git cherry-pick $i | |
done | |
# cleanup | |
for repo in $repos; do | |
git branch -D $repo | |
git remote remove $repo | |
git update-ref -d refs/original/refs/heads/$repo | |
done | |
git gc --aggressive | |
) |
I suck at git and bash, but I couldn't get this to work.
I had Gemini write a new script:
https://gist.github.com/mindplay-dk/55f8a8f81049b2fd7f44dff3623659b2
This basically works - the only issue is I end up with giant, monolithic merge commit with a comment like feat: Merge repository 'backend'
, which is very much unwanted.
I don't know what your script does, because I couldn't get it to work.
Anyway, this sort of, mostly works, and I guess I could live with the result - but the resulting git history is definitely not optimal.
Ideally, I'd want a history that really looks like all of those commits were always made in a single repo with two (or more) subfolders.
I don't know if that's possible...
I can't believe there isn't a finished tool/script that does this, but I've looked seriously everywhere - there are tons of tools that can probably do this and a gazillion other things if you know how, but I am not at that level of git or bash knowledge...
Maybe someone else will see this and try to figure it out... 😌
Why did you change line 25. I wanted to correct it but then I saw that you purposely changed that line. It just cannot work this way.