aboutsummaryrefslogtreecommitdiff
path: root/doc/forum/migrate_existing_git_repository_to_git-annex.mdwn
blob: f673de765b81f8166295b7afbdd435e99a731e43 (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
I have a large git repository with binary files scattered over different branches. I want to switch to git-annex mainly for performance reasons, but I don't want to loose my history.

I tried to rewrite the (cloned) repository with git-filter-branch but failed miserably for several reasons:

* --tree-filter performs its operations in a temporary directory (.git-rewrite/t/) so the symlinks point to the wrong destination (../../.git/annex/).
* annex log files are stored in .git-annex/ instead of .git-rewrite/t/.git-annex/ so the filter operation misses them

Any suggestions how to proceed?

EDIT 3/2/2010
I finally got it working for my purposes. Hardest part was preserving the branches while injecting the new `git annex setup` base commit.

#### Clone repository
    git clone original migrate
    cd migrate
    git checkout mybranch
    git checkout master
    git remote rm origin

#### Inject `git annex setup` base commit and repair branches
    git symbolic-ref HEAD refs/heads/newroot
    git rm --cached *
    git clean -f -d
    git annex init master
    echo \*.rpm annex.backend=SHA1 >> .gitattributes
    git commit -m "store rpms in git annex" .gitattributes
    git cherry-pick $(git rev-list --reverse master | head -1)
    git rebase --onto newroot newroot master
    git rebase --onto master mybranch~1 mybranch
    git branch -d newroot

#### Migrate repository
    mkdir .temp
    cp .git-annex/* .temp/
    MYWORKDIR=$(pwd) git filter-branch \
     --tag-name-filter cat \
     --tree-filter '
        mkdir -p .git-annex;
        cp ${MYWORKDIR}/.temp/* .git-annex/;
        for rpm in $(git ls-files | grep "\.rpm$"); do
            echo;
            git annex add $rpm;
            annexdest=$(readlink $rpm);
            if [ -e .git-annex/$(basename $annexdest).log ]; then
                echo "FOUND $(basename $annexdest).log";
            else
                echo "COPY $(basename $annexdest).log";
                cp ${MYWORKDIR}/.git-annex/$(basename $annexdest).log .git-annex/;
                cp ${MYWORKDIR}/.git-annex/$(basename $annexdest).log ${MYWORKDIR}/.temp/;
            fi;
            ln -sf ${annexdest#../../} $rpm;
        done;
        git reset HEAD .git-rewrite;
        :
        ' -- $(git branch | cut -c 3-)
    rm -rf .temp
    git reset --hard


TODO:

* Find a way to repair branches automatically (detect branch points and run appropriate `git rebase` commands)

I'll be happy to try any suggestions to improve this migration script.

P.S. Is there a way to edit comments?