我目前正在将CVS存储库转换为多个git存储库。
cvs2git进程很好,但是我在运行filter-branch命令时遇到了问题。我用简单的脚本测试命令,因为主存储库大小是4Go,提交超过14k。
在此过程中,我想根据git仓库历史中的内容替换一些档案。
这是我用来测试filter-branch --tree-filter命令的脚本:
#!/bin/bash
BASEDIR=/tmp/migration_git
if test ! -d $BASEDIR; then
mkdir $BASEDIR
fi
script_tree_filter='\
archives=`find . -name "archive.tgz"`; \
CURDIR=`pwd`; \
for archive in $archives; do \
cd `dirname $archive`; \
tar xzf archive.tgz ; \
rm -f archive.tgz ; \
cd $CURDIR;\
done'
cd $BASEDIR
if test -d repo.server.git; then
rm -rf repo.server.git;
fi
mkdir repo.server.git && cd repo.server.git && git init
touch a toto && tar czf archive.tgz a && rm a && git add . && git commit -am "1st commit" && git tag commit1
touch b a && rm archive.tgz && tar czf archive.tgz a b && rm a b && git commit -am "2nd commit" && git tag commit2
touch a b c && rm archive.tgz && tar czf archive.tgz a b c && rm a b c && git commit -am "3rd commit" && git tag commit3
# git rm archive.tgz && mkdir rep1 rep2
mkdir rep1 rep2
cd rep1 && touch a b c d && tar czf archive.tgz a b c d && rm a b c d && cd ..
cd rep2 && touch a b c d && tar czf archive.tgz a b c d && rm a b c d && cd ..
git add . && git commit -am "4th commit" && git tag commit4
cd $BASEDIR
if test -d repo.client.git; then
rm -rf repo.client.git;
fi
git clone repo.server.git repo.client.git
cd $BASEDIR/repo.client.git
git filter-branch -f -d /tmp/test_git --tag-name-filter cat --prune-empty --tree-filter "$script_tree_filter" -- --all
git for-each-ref --format="%(refname)" refs/original/ | xargs -n 1 git update-ref -d
git reflog expire --expire=now --all
git gc --prune=now
我有两个问题:
最后,脚本在此过程中显示错误:
错误:未经跟踪的工作树文件'a'将被合并覆盖。
如果使用--mirror:
完成客户端克隆git clone --mirror repo.server.git repo.client.git
错误不会出现。我不明白为什么。
当我cd到repo.client.git时,存储库有本地修改:存档存在,我想保留的文件被git删除。我也不明白。 编辑:文件a,b,c,d是否为空,不会改变结果。
答案 0 :(得分:0)
在DomQ的评论之后,我升级了我的Git版本(1.8.0 => 1.8.3),问题不再出现了。