"Should I create a new, blank project and successively add old
projects and then replay the current repository onto it?"
Yes.
Assuming the "pre-history" merges cleanly onto the existing history you can graft the two histories together with two git commands. From within your new git repository, run this:
git --git-dir=/path/to/original/.git log -m -p --reverse --first-parent --binary --pretty=email | git am --keep-non-patch --whitespace=fix
That's kind of hard to see, so here it is formatted weirdly but visibly (and still runnable as long as you copy & paste all-in-one):
git --git-dir=/path/to/original/.git \
log -m -p --reverse --first-parent --binary --pretty=email |
git am --keep-non-patch --whitespace=fix
Run a "git log" command afterwards to make sure everything is correct. Once you are happy, I recommend deleting or renaming the existing bitbucket repo, and pushing this one in its place.
Caveat #1: "git log --first-parent" strips out all branches and merges from the history, and so the result is just a single linear sequence of commits. (For more reading about --first-parent: GIT: How can I prevent foxtrot merges in my 'master' branch?, and https://bit-booster.blogspot.ca/2016/02/no-foxtrots-allowed.html).
Caveat #2: "git am" hates empty commits (e.g., git commit --allow-empty), and so if you have any of those, you will have to break the procedure into a three step process: 1. git log > git_am.log. 2. Remove empty patches from "git_am.log". 3. cat git_am.log | git am
Here are some notes about the "git log" options used above:
-m
Include patches caused by merge commits.
-p
Show patches in the "git log" output.
--reverse
Reverse "git log" ordering (since we want oldest-to-newest).
--first-parent
Only include 1st parent of merge commits.
--binary
Include binary-diffs in output.
--pretty=email
Have "git log" output its data in the "email" format
that "git am" is expecting.
I leave looking up the "git am" options as an exercise for the reader (e.g., "git help am").