1
0
Fork 0

Added full workflow for migration.

This commit is contained in:
jochan 2017-06-20 10:50:47 -07:00
parent 6fbbf693f4
commit 6283bad98a
5 changed files with 67 additions and 12 deletions

27
README.md Normal file
View File

@ -0,0 +1,27 @@
# Mercurial to Git Migration
## Notes
* If any .sh scripts cannot be executed, replace `./` with `bash ` or execute `chmod u+x <.sh script>`.
* The scripts require some of the following arguments:
* `<source>`: The Mercurial repository that you are migrating **FROM**.
* `<target>`: The Git repository that you are mirating **TO**.
* `<authors>`: The directory to which authors.py and users.csv will be copied.
* `<fast-export>`: The directory to which https://github.com/frej/fast-export will be cloned. All files in this directory will be overwritten.
* `<bfg-cleaner>`: The directory to which the BFG Repo-Cleaner .jar file will be downloaded.
## Instructions
0. Copy all hg2git\*.sh, authors.py, and users.csv files to the same directory.
1. Run `./hg2git.sh <source> <target> <authors> <fast-export>`. This may take a while. Do **NOT** delete the reformatted-authors.txt file.
2. If you have new changes in your Mercurial repository and you wish to update your Git repository, ensure the changes have been pulled (`hg pull`) and run `./hg2git_update.sh <source> <target>`.
3. Before moving on, make sure that you are **absolutely sure** you no longer need to update your Git repository from your Mercurial repository. Once you perform the next steps, you **cannot** update again.
4. To strip out large files from history and delete closed branches, run `./hg2git_clean.sh <source> <target> <bfg-cleaner>`. Files larger than 40M will be stripped. This may take a while.
5. To copy .hgignore files to .gitignore, convert _some_ of the regex to globs, and commit these files for every branch, run `./hg2git_ignore.sh <target>`. Note that this will convert the repository from bare to non-bare and check out files.
6. Set an upstream (`git remote add origin <url>`) and push the repository (`git push -u origin master`). This may take a while.
## TL;DR
1. `./hg2git.sh <source> <target> <authors> <fast-export>`
2. `./hg2git_update.sh <source> <target>`
3. Read [Instructions](#instructions) > Step 3.
4. `./hg2git_clean.sh <source> <target> <bfg-cleaner>`
5. `./hg2git_ignore.sh <target>`
6. `git remote add origin <url> && git push -u origin master`

View File

@ -1,5 +1,7 @@
#!/bin/bash
set -e
unset source
unset target
unset authors

View File

@ -1,5 +1,7 @@
#!/bin/bash
set -e
unset source
unset target
unset bfg_cleaner
@ -28,15 +30,5 @@ cd $target
comm -2 -3 all.log open.log > closed.log
for branch in `cat closed.log`; do git tag "closed/$branch" $branch; git branch -df $branch; done
# TODO: Loop this for each open branch
echo "Creating .gitignore files from .hgignore files..."
find . -name ".hgignore" > hgignore-files.log
touch gitignore-files.log
for file in `cat hgignore-files.log`; do
newfile=${file/hgignore/gitignore};
echo $newfile >> gitignore-files.log
cp $file $newfile;
sed -i.bak "s/syntax:/#syntax:/; s/^\^//; s/\$$//; s/\\\w\+/*/; s/\\\\\//\//g" $newfile;
done
echo "All done! This Git repository is now ready to be pushed after the .gitignore files have been committed to the desired branches."
echo "All done! This Git repository is now ready to be pushed."
echo "If you'd like to create and commit some .gitignore files, run hg2git_ignore.sh."

32
hg2git_ignore.sh Executable file
View File

@ -0,0 +1,32 @@
#!/bin/bash
set -e
unset $target
target=$1
if [[ -z $target ]]; then
echo "Please provide the path to the desired Git repository!"
exit 1
fi
echo "Creating and committing .gitignore files for each branch..."
cd $target
git config --bool core.bare false
for branch in `git branch | sed "s/*/ /g"`; do
git checkout $branch -f
find . -name ".hgignore" > hgignore-files.log
> gitignore-files.log
for file in `cat hgignore-files.log`; do
newfile=${file/hgignore/gitignore}
echo $newfile >> gitignore-files.log
cp $file $newfile
sed -i.bak "s/syntax:/#syntax:/; s/^\^//; s/\$$//; s/\\\w\+/*/; s/\\\\\//\//g" $newfile
done
cat gitignore-files.log | xargs git add
if [[ -s gitignore-files.log ]]; then
git commit -m "Added .gitignore files."
fi
done
echo "All done! This Git repo is now ready to be pushed."

View File

@ -1,5 +1,7 @@
#!/bin/bash
set -e
unset source
unset target
source=$1