-
-
Save pmiossec/2421ffcc8011e873641b to your computer and use it in GitHub Desktop.
#Script to permit to rcheckin a git repository to a newly created TFVC repository with git-tfs | |
#adaptation from my answer: http://stackoverflow.com/questions/645450/insert-a-commit-before-the-root-commit-in-git/30558271#30558271 | |
#usage: pass to the script (1) the url of the tfs server, (2) the tfs path in the repository, (3) the changeset id | |
#../replace_root.sh "https://urlOfYourTfs/DefaultCollection" "$/EmptyTfs/Trunk" 21 | |
tfsServer=$1 | |
tfsPath=$2 | |
tfsChangesetId=$3 | |
gitTfsMetadata="git-tfs-id: [$tfsServer]$tfsPath;C$tfsChangesetId" | |
echo "Creating a root commit with git-tfs metadatas:" | |
echo $gitTfsMetadata | |
root_commit_sha=$(git rev-list --max-parents=0 HEAD) | |
git checkout --force --orphan new-root | |
find . -path ./.git -prune -o -exec rm -rf {} \; 2> /dev/null | |
git add -A | |
GIT_COMMITTER_DATE="2000-01-01T12:00:00" git commit --date==2000-01-01T12:00:00 --allow-empty -m $gitTfsMetadata | |
new_root_commit_sha=$(git rev-parse HEAD) | |
echo "The commit '$new_root_commit_sha' will be added before existing root commit '$root_commit_sha'..." | |
parent="parent $new_root_commit_sha" | |
replacement_commit=$( | |
git cat-file commit $root_commit_sha | sed "s/author/$parent\nauthor/" | | |
git hash-object -t commit -w --stdin | |
) || return 3 | |
git replace "$root_commit_sha" "$replacement_commit" | |
git filter-branch -- --all | |
rm -rf ./.git/refs/original | |
rm -rf ./.git/refs/replace | |
git checkout -f master | |
git branch -D new-root | |
git tfs bootstrap |
@sawpresto - Checkout my fork. I got it working on Windows. https://gist.github.com/mikesigs/a1da22915d1376ee889d
One problem was the find
command in this script is intended to use the bash version of that command, but the Windows one is used instead. To fix that I reference the find command by its full path. Then on the next line (starting with GIT_COMMITTER_DATE) I had to enclose $gitTfsMetadata in double quotes. I also wrapped the last 6 commands in a conditional, prompting the user to continue or not. Reason being, up to that point everything is reversable by just deleting .git/refs/replace
and the new-root branch. In fact, I preferred to run those last 6 commands manually. Also, make a backup before running this!
My script isn't perfect either. I'm a bash script newb. But it worked on Windows, and I hope that can help you/someone else.
But thanks most of all to @pmiossec for the original!
Thanks for creating this, pmiossec! I'm running into a couple of issues when trying to run this script from the Git repo (not the TFVC git-tfs repo). When I put in the only changeset in the TFVC repo (which would normally have matched with the first commit from git-tfs), after running and switching to a new branch, I got the error: pathspec '[{repo}]{project};C289' did not match any file(s) known to git. fatal: ambiguous argument 'HEAD': unknown revision or path not in the working tree. Any ideas? I suspect the error is happening at line 16. I'm using a Windows and it looks like the script did start running. Thanks!